Android开发-新建线程崩溃
Posted Badwood-涂鸦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发-新建线程崩溃相关的知识,希望对你有一定的参考价值。
一直不满意车机不能实现屏保,最近发现可以通过设置亮度实现,顾萌生了自己写程序的来实现的念头,遂修改原来练手的app。毕竟过去了1年,各类程序、sdk都已经更新了不知道多少版本。经历了痛苦的升级、更新,终于没能在原有的代码上直接升级,还是新建一个工程,复制原来的代码来生成app。
原来可以跑的app,竟然崩溃,而且还不能截获异常。通过debug,发现崩溃跟新建了一个线程有关,网上度了一下,发现还是能够捕获此类异常,原文:Android UncaughtExceptionHandler捕获线程崩溃异常。
我原来的代码仅一句:new downloadApkThread().start();
修改为:
1 Thread thread = new downloadApkThread(); 2 thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 3 @Override 4 public void uncaughtException(Thread thread, Throwable ex) { 5 //TODO 6 System.out.println(ex.getLocalizedMessage()); 7 } 8 }); 9 thread.start();
在行6处断点,发现线程崩溃的原因是:“Can‘t create handler inside thread that has not called Looper.prepare()”。继续在网上度,解释非常多,原因没仔细看,大概跟主从线程之间的消息分发有关,发扬一贯的囫囵吞枣精神,找了个能解决问题的最简单方案用了:Android开发报错 Can not create handler inside thread t
我的从线程代码中出现使用了Toast之类的方法:“Toast.makeText(mContext, mContext.getResources().getString(R.string.soft_update_fail_downloadapk), Toast.LENGTH_LONG).show();”之类的代码时,就在前面加Looper.prepare();,后面加Looper.loop();。当然,还要记得import android.os.*;
解决了两个问题,线程崩溃的异常截获,据原文描述,可以在主activity的OnCreate方法中添加下面代码,就可以截获所有线程发生时的异常,听起来挺美好,不过我没试,以后有需要再说吧。
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread thread, Throwable ex) { //任意一个线程异常后统一的处理 System.out.println(ex.getLocalizedMessage()); finish(); } });
至于第二个问题,不知道为何原来的代码没问题,现在就出现问题,也许是android studio和SDK升级了所致?反正没时间深究。
以上是关于Android开发-新建线程崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Android - 应用程序启动时片段 onCreate 崩溃
在android studio中升级repo v9后,片段必须是公共静态类崩溃错误