Commit bde0320d authored by Mygod's avatar Mygod

Fix NetworkOnMainThreadException

parent ada47aba
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
package com.github.shadowsocks.net package com.github.shadowsocks.net
import android.os.Build
import com.github.shadowsocks.utils.printLog import com.github.shadowsocks.utils.printLog
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
...@@ -65,11 +66,17 @@ class ChannelMonitor : Thread("ChannelMonitor") { ...@@ -65,11 +66,17 @@ class ChannelMonitor : Thread("ChannelMonitor") {
start() start()
} }
/**
* Prevent NetworkOnMainThreadException because people enable strict mode for no reasons.
*/
private suspend fun WritableByteChannel.writeCompat(src: ByteBuffer) =
if (Build.VERSION.SDK_INT <= 23) withContext(Dispatchers.Default) { write(src) } else write(src)
suspend fun register(channel: SelectableChannel, ops: Int, block: (SelectionKey) -> Unit): SelectionKey { suspend fun register(channel: SelectableChannel, ops: Int, block: (SelectionKey) -> Unit): SelectionKey {
val registration = Registration(channel, ops, block) val registration = Registration(channel, ops, block)
pendingRegistrations.send(registration) pendingRegistrations.send(registration)
ByteBuffer.allocateDirect(1).also { junk -> ByteBuffer.allocateDirect(1).also { junk ->
loop@ while (running) when (registrationPipe.sink().write(junk)) { loop@ while (running) when (registrationPipe.sink().writeCompat(junk)) {
0 -> kotlinx.coroutines.yield() 0 -> kotlinx.coroutines.yield()
1 -> break@loop 1 -> break@loop
else -> throw IOException("Failed to register in the channel") else -> throw IOException("Failed to register in the channel")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment