Koc*_*cus 10 android onclick android-anr-dialog android-activity
我有一个简单的设置:
CrashHandler- 实施的一个类Thread.UncaughtExceptionHandler;CrashActivity - 可以发送用户报告的活动;MainActivity - 用户应与之交互的主应用程序. 当在其中MainActivity任何一个线程中存在未捕获的异常时,CrashHandler它会拦截它并创建一个意图启动通知的通知CrashActivity:
Intent it = new Intent("CrashReporter" + SystemClock.currentThreadTimeMillis());
it.setClass(context, CrashActivity.class);
it.setFlags(it.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)
同时Android显示"应用程序崩溃"消息,用户单击"确定",应用程序关闭,然后用户可能会单击notification.如果notification单击,则CrashActivity启动并显示.
这段代码已经在很多不同的情况下工作了很长时间(主线程崩溃handler,崩溃,背景崩溃thread......).但是,我最近发现,如果在OnClickListener.onClick附加到a button中的侦听器中的方法中抛出异常,则它不起作用MainActivity.情况如下:
NullPointerException;CrashHandler拦截它并创建一个notification(显示);MainActivity被冻结;CrashActivity,则会显示黑屏并且所有内容都会冻结(未显示所需的活动).Logcat显示启动时超时,甚至在OnCreate我的代码之前或之前:
I/ActivityManager(11826): START u0 {act=CrashHandler1196 flg=0x14000000 cmp=mycompany.myapp/.CrashActivity bnds=[0,102][720,230] (has extras)} from pid -1
W/KeyguardViewMediator(11826): verifyUnlock called when not externally disabled
W/ActivityManager(11826): Activity pause timeout for ActivityRecord{41f4d988 u0 mycompany.myapp/.MainActivity}
W/ActivityManager(11826): Launch timeout has expired, giving up wake lock!
W/ActivityManager(11826): Activity idle timeout for ActivityRecord{4225eeb8 u0 mycompany.myapp/.CrashActivity}
Run Code Online (Sandbox Code Playgroud)
notification我之前杀了应用程序ADB,那就notification完美了.如果在点击之前notification我在冻结的应用上做了一些点击和手势,几秒钟后我会收到一条消息ANR:
E/ActivityManager(11826): ANR in mycompany.myapp (mycompany.myapp/.MainActivity)
E/ActivityManager(11826): Reason: keyDispatchingTimedOut
E/ActivityManager(11826): Load: 0.63 / 0.57 / 0.49
Run Code Online (Sandbox Code Playgroud)如果我点击"是,杀了它",然后点击它notification,它完美无缺.
System.exit(-1)CrashHandler,应用程序立即退出并且通知工作完美(不幸的是,我无法在生产中使用此解决方案).我有两个问题:
NullPointer exceptionin OnClickListener.onClick不会导致应用程序崩溃,而是将其与操作系统一起冻结并阻止其他活动启动?CrashActivity在这些条件下开始?小智 0
在看不到代码的情况下,您应该调试 CrashHandler 类。JVM将忽略此中的所有异常
void uncaughtException(Thread t, Throwable e)
Run Code Online (Sandbox Code Playgroud)
“此方法抛出的任何异常都将被 Java 虚拟机忽略。” (Java 文档)。
我并不是说这就是答案,但如果此方法抛出异常,则可能是答案。
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |