ANR ошибка возникает в сопрограмме в Android - PullRequest
0 голосов
/ 19 июня 2019

Я использую coroutinue в CoroutinueScope в контексте Dispatchers.Default. Иногда возникает ошибка ANR, когда не отвечает долгое время (SEC 5). Как избежать этого случая.

Функция requestWait ждет бесконечное время, я не изменяю эту функцию, потому что это нативный метод в Android. И API моего устройства 21 уровня, очень грустный.

connection: UsbDeviceConnection = null
private fun workerTask(usbSerialDevice: UsbSerialDevice) = CoroutineScope(Dispatchers.Default).launch {
    while (isActive) {
        val request = connection.requestWait()
        if (request != null && request.endpoint.type == UsbConstants.USB_ENDPOINT_XFER_BULK
                && request.endpoint.direction == UsbConstants.USB_DIR_IN) {
            var data = serialBuffer!!.dataReceived

ANR Log

"DefaultDispatcher-worker-2" daemon prio=5 tid=12 SUSPENDED
  | group="main" sCount=1 dsCount=0 obj=0x4233f510 self=0x6aa10cd0
  | sysTid=3412 nice=0 sched=0/0 cgrp=apps handle=1788940584
  | state=S schedstat=( 0 0 0 ) utm=102 stm=51 core=3
  #00  pc 00021910  /system/lib/libc.so (__futex_syscall3+8)
  #01  pc 0000ef94  /system/lib/libc.so (__pthread_cond_timedwait_relative+48)
  #02  pc 0000eff4  /system/lib/libc.so (__pthread_cond_timedwait+64)
  #03  pc 00053553  /system/lib/libdvm.so
  #04  pc 00053b19  /system/lib/libdvm.so (dvmChangeStatus(Thread*, ThreadStatus)+34)
  #05  pc 0004dffb  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+406)
  #06  pc 00000214  /dev/ashmem/dalvik-jit-code-cache (deleted)
  at android.hardware.usb.UsbDeviceConnection.native_request_wait(Native Method)
  at android.hardware.usb.UsbDeviceConnection.requestWait(UsbDeviceConnection.java:209)
  at com.kisane.display.smartdisplay.serial.usbserial.UsbSerialDevice$workerTask$1.invokeSuspend(UsbSerialDevice.kt:60)
  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
  at kotlinx.coroutines.DispatchedTask$DefaultImpls.run(Dispatched.kt:235)
  at kotlinx.coroutines.DispatchedContinuation.run(Dispatched.kt:81)
  at kotlinx.coroutines.scheduling.Task.run(Tasks.kt:94)
  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
  at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:732)

Выше кода мой источник. Произошла ошибка ANR в CoroutineScope (Dispatchers.Default) .launch. Как избежать этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...