В последнее время я читал много статей и смотрел много видео о совместных действиях Kotlin, и, несмотря на все мои усилия, я все еще не могу понять их в своей голове.
IКажется, я наконец нашел способ проиллюстрировать свою проблему:
class MyViewModel() : CoroutineScope {
override val coroutineContext = Dispatchers.Main + Job()
fun foo() = launch(handler) {
Log.e("test", "A")
}
}
class MainActivity : Activity() {
override fun onCreate() {
MainViewModel().foo()
Log.e("test", "B")
}
}
Вывод этого:
E/test: B
E/test: A
И я не понимаю, как это может быть,Я использую только один поток (основной поток).Если мой код выполняется последовательно, к тому времени, как я достигну строки, log(B)
... log(A)
уже должно быть напечатано.
Использует ли библиотека сопрограмм внутренние потоки для достижения этой цели?Это единственное объяснение, которое я мог придумать, но не нашел ничего такого в документах.
PS: Извините, что бросил android
в микс, но этот код:
fun main() {
GlobalScope.launch(Dispatchers.Unconfined) { // launch new coroutine in background and continue
print(Thread.currentThread().name + "World!") // print after delay
}
(0 .. 1000).forEach { print(".") }
}
, кажется, работает как ожидалось и печатает: main @coroutine#1World!...........................
, потому что 1 thread == sequential work
Надеюсь, мой вопрос имеет смысл, спасибо за чтение!