Авария | Не могу получить доступ к Looper на Coroutines Dispatchers.IOAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Авария | Не могу получить доступ к Looper на Coroutines Dispatchers.IO

Сообщение Anonymous »

Я выполняю некоторые задачи в Coroutines Dispatchers.IO, например, для достижения параллелизма:

Код: Выделить всё

fun postMessage(request: Request) {
CoroutineScope(Dispatchers.IO).launch {
val requestHandler = getRequestHandler(request)
requestHandler.handleRequest()
}
}
Эти задачи по отдельности могут вызывать другие методы или классы, которые используют Handler или Toast, и для них требуется циклик. Looper отсутствует в Dispatchers.IO. Они также могут выполнять задачи, связанные с пользовательским интерфейсом, и другие фоновые задачи. Это не проблема: для задач, связанных с пользовательским интерфейсом, я могу просто запустить сопрограмму с помощью Dispatchers.Main.
Вот пример трассировки:

Код: Выделить всё

FATAL EXCEPTION: DefaultDispatcher-worker-1
Process: com.mywebapp.app, PID: 14902
java.lang.RuntimeException: Can't create handler inside thread Thread[DefaultDispatcher-worker-1,5,main] that has not called Looper.prepare()
Я также пробовал выполнять эти задачи в HandlerThread, тогда эти задачи будут выполняться «последовательно» в этом потоке.
Я также пробовал создать HandlerThread:

Код: Выделить всё

class MyDispatcher {
val handlerThread = HandlerThread("myThread").apply {
start()
}
val handler = Handler(handlerThread.looper)
val coroutineDispatcher = handler.asCoroutineDispatcher()
}
а затем запускаем такую ​​сопрограмму:

Код: Выделить всё

val dispatcher = MyDispatcher()
CoroutineScope(dispatcher.coroutineDispatcher).launch {
//....
}
Однако при этом все мои задачи будут выполняться последовательно в «myThread».
Я хочу добиться настоящего параллелизма здесь, в Dispatchers. IO предоставит нам.
И как мне решить эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/786 ... atchers-io
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»