Kotlin сопрограммы - переключение потоков - PullRequest
3 голосов
/ 07 апреля 2020

Я новичок в Android сопрограмм . Я читал об этом из официальных документов и нашел это примечание

Важно: Использование диспетчера, использующего пул потоков, такого как Dispatchers.IO или Dispatchers.Default, не позволяет. гарантировать, что блок выполняется в том же потоке сверху вниз. В некоторых ситуациях сопрограммы Kotlin могут перемещать выполнение в другой поток после приостановки и возобновления. Это означает, что локальные переменные потока могут не указывать на одно и то же значение для всего блока withContext ().

, но я не получил это конкретное c предложение

Это означает, что локальные переменные потока могут не указывать на одно и то же значение для всего блока withContext ()

Может кто-нибудь показать мне пример этого сценария?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2020

myLooper() и prepare() в Looper используют локальную переменную потока для хранения экземпляра для каждого потока Looper.

Итак, представьте себе такой сценарий:

  • Вы launch() сопрограмма на Dispatchers.Default
  • В этой сопрограмме вы prepare() a Looper и пытаетесь использовать это для чего-то (например, с Messenger)
  • Затем вы вызываете некоторую suspend функцию

Когда эта функция suspend возвращается, вы можете не быть в том же потоке, в котором находились до вызова этой функции suspend. Это будет нить из Dispatchers.Default, но не обязательно указанная нить c, в которой вы были ранее. В результате ваш Looper может быть связан с каким-то другим потоком, который вы используете в своей системе сопрограмм. В зависимости от того, что вы пытались сделать здесь, тот факт, что вы находитесь в другом потоке, может вызвать проблемы в том, что вы хотели для Looper.

Реальный урок здесь: используйте HandlerThread, чтобы получить Looper, а не prepare().

1 голос
/ 07 апреля 2020

Это относится к переменным, которые являются c для потока (см. this для справки).

Скорее всего, это вас не касается, использование локальных переменных потока довольно * 1007 Удельный *. Тот факт, что ваша сопрограмма может перейти в другой поток при возобновлении, не повлияет в обычных случаях.

...