Я устанавливаю сетевую среду на основе kotlin сопрограммы для jvm. Классы Client и Server реализуют CoroutineScope, а переопределение для coroutinecontext - это Dispatchers.IO, так как я уверен, что это правильный Dispatcher для использования в таком случае. Однако я хочу обработать прочитанные пакеты в основном потоке или, по крайней мере, предоставить эту опцию. Не читая документацию, я использовал Dispatchers.Main, который теперь я понял, для потока пользовательского интерфейса Android. Есть ли диспетчер, который я могу использовать для запуска сопрограммы в главном потоке? Если нет, как бы я сделал один?
Я просмотрел документацию kotlin о том, как создать диспетчер, основанный на одном потоке, но я не смог найти ничего, кроме newSingleThreadContext, который создает новый поток. Я также понял, что возможно создать диспетчер из Java-исполнителя, но я все еще не уверен, как ограничить это уже существующим потоком.
class AbstractNetworkComponent : CoroutineScope {
private val packetProcessor = PacketProcessor()
private val job = Job()
override val coroutineContext = job + Dispatchers.IO
}
class PacketProcessor : CoroutineScope {
private val job = Job()
override val coroutineContext = job + Dispatchers.Main //Android only!
private val packetHandlers = mutableMapOf<Opcode, PacketHandlerFunc>()
fun handlePacket(opcode: Opcode, packet: ReceivablePacket, networker: Writable) {
launch(coroutineContext) {
packetHandlers[opcode]?.invoke(packet, networker)
}
}
}
Так что с Dispatchers.Main я получаю исключение IllegalStateException из-за отсутствия компонента Android. Есть ли способ создать диспетчер, который блокирует основной поток до его завершения (как это делает runBlocking?) Спасибо!