ANR от сопрограммы - PullRequest
       25

ANR от сопрограммы

0 голосов
/ 07 июля 2019

Как давний Java-программист, перешедший на Kotlin, я работал над тем, чтобы обернуть голову в сопрограммы.Вообще, я думаю, что теперь у меня есть довольно хорошее представление о них, но потом я сталкиваюсь с таким случаем ...

У меня есть то, что я считаю классическим использованием сопрограмм: выполнить длительную операциюбез блокировки потока пользовательского интерфейса.Я структурировал свой код следующим образом:

fun updateUI() {
    CoroutineScope(Dispatchers.Main).launch {
        doUpdate()
        // update the UI with results of doUpdate()
    }
}

и

suspend fun doUpdate() =
    withContext(Dispatchers.Default) {
        // long-running operations here
    }

... где updateUI вызывается в основном потоке (UI).

Запуская его в интерактивном режиме в моей среде разработки, кажется, что он работает должным образом - поток пользовательского интерфейса не заблокирован, и ANR не сообщается.

Однако моя консоль Play сообщает ANR для этого кода:

"main" prio=5 tid=1 Runnable
| group="main" sCount=0 dsCount=0 obj=0x75eb4268 self=0xa8784e00
| sysTid=4957 nice=0 cgrp=default sched=0/0 handle=0xab948534
| state=R schedstat=( 178941824 76636302 233 ) utm=6 stm=11 core=1 HZ=100
| stack=0xbe61c000-0xbe61e000 stackSize=8MB
| held mutexes= "mutator lock"(shared held)
at com.mypackage.ClassName.doUpdate (ClassName.java:66)
- locked <0x04706efb> (a com.mypackage.ClassName)
at com.mypackage.ClassName$updateUI$1.invokeSuspend (ClassName.java:149)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (BaseContinuationImpl.java:33)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.java:241)
at android.os.Handler.handleCallback (Handler.java:751)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6823)
at java.lang.reflect.Method.invoke! (Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1563)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1451)

Может ли кто-нибудь с большим опытом сопрограмм предложить какое-либо понимание этого вопроса?

...