Доступ к области из неверного потока при использовании области с сопрограммами - PullRequest
0 голосов
/ 28 декабря 2018

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

Что я наблюдаю, так это то, что потоки переключаются в цикле создание бросков областиэто исключение: Доступ к области из неверного потока.Доступ к объектам области возможен только в том потоке, в котором они были созданы.

withContext(Dispatchers.IO) {
            val realm = Realm.getDefaultInstance()
            val images = mutableListOf<String>("id1", "id2", ...)
            for (imageId in images) {
                 println("THREAD : ${Thread.currentThread().name}")
                 val image = realm.where<Image>().equalTo("imageId", imageId).findFirst()
                 delay(1000) // Can lead to an actual switching to another thread
            }
            realm.close()
}

Как указано в документации dispatchers.IO: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-i-o.html

"Этот диспетчер разделяетпотоки с диспетчером [Default] [Dispatchers.Default], поэтому использование * withContext(Dispatchers.IO) { ... } не приводит к фактическому переключению на другой поток; * обычно выполнение продолжается в том же потоке. "

Я непонять, почему нити переключаются в цикле.Как правильно управлять экземпляром области с сопрограммой?

1 Ответ

0 голосов
/ 28 декабря 2018

Каждый раз, когда сопрограмма приостанавливается, во время ее возобновления диспетчер находит поток для его выполнения.Вполне вероятно, что это будет поток, отличный от того, на котором он работал ранее.

...