DanmakuFlameMaster
DanmakuFlameMaster copied to clipboard
mDanmakuView.release()引发ANR问题
请教调用mDanmakuView.release()引发的ANR问题,哪个版本解决的啊,还是说没解决?
0.4.0或0.4.1已解决
private void stopDraw() { unlockCanvasAndPost(); if (handler != null) { handler.quit(); handler = null; } if (mHandlerThread != null) { HandlerThread handlerThread = this.mHandlerThread; mHandlerThread = null; try { handlerThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } handlerThread.quit(); } }
是通过这两行代码: HandlerThread handlerThread = this.mHandlerThread; mHandlerThread = null; 解决的吗? 模拟了一下场景,还是会出现ANR。能解释一下为什么要调用handlerThread.join()吗
调join是确保线程正常退出,如果不join等待,在程序退出时线程没有正常退出的话,无用线程会在后台持续存在,导致资源占用,相比之下选择ANR报错更容易发现和提示问题。
可是,我还是没明白你是怎么修复ANR的,请指出。
因为HandlerThread - run()属于SDK了,出现ANR以后,我并没有办法去修改
0.9.25 能重现。
调用release会产生anr
0.4.0或0.4.1已解决
0.9.25 会复现,现有复现机型如下:
- VIVO V1818CA | Android 8.1.0,level 27
- 荣耀 YAL AL00 | Android 10,level 29
- 小米 MI 9 | Android 10,level 29
- 魅族 PRO 5 | Android 7.0,level 24
- 金立 S10CL | Android 7.1.1,level 25
日志如下:
Input dispatching timed out
ANR Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 7.)
java.lang.Object.wait(Native Method)
2 java.lang.Object.wait(Object.java:407) 3 java.lang.Thread.join(Thread.java:1290) 4 java.lang.Thread.join(Thread.java:1366) 5 master.flame.danmaku.ui.widget.DanmakuView.k(DanmakuView.java:9) 6 master.flame.danmaku.ui.widget.DanmakuView.j(DanmakuView.java:1) 7 master.flame.danmaku.ui.widget.DanmakuView.release(DanmakuView.java:1)