myLooper()
и prepare()
в Looper
используют локальную переменную потока для хранения экземпляра для каждого потока Looper
.
Итак, представьте себе такой сценарий:
- Вы
launch()
сопрограмма на Dispatchers.Default
- В этой сопрограмме вы
prepare()
a Looper
и пытаетесь использовать это для чего-то (например, с Messenger
) - Затем вы вызываете некоторую
suspend
функцию
Когда эта функция suspend
возвращается, вы можете не быть в том же потоке, в котором находились до вызова этой функции suspend
. Это будет нить из Dispatchers.Default
, но не обязательно указанная нить c, в которой вы были ранее. В результате ваш Looper
может быть связан с каким-то другим потоком, который вы используете в своей системе сопрограмм. В зависимости от того, что вы пытались сделать здесь, тот факт, что вы находитесь в другом потоке, может вызвать проблемы в том, что вы хотели для Looper
.
Реальный урок здесь: используйте HandlerThread
, чтобы получить Looper
, а не prepare()
.