(一) 前言
各位亲爱的午餐童鞋,是否是常常由于本身的程序中出现未层捕获的异常致使程序异常终止而痛苦不已?嗯,是的。。 可是,你们不要怕,今天给你们分享一个东东能够解决你们这种困扰,吼吼!
(二) UncaughtExceptionHandler接口
这个接口,顾名思义,就是处理程序中没有处理的异常,并且是在系统抛出异常致使程序异常终止以前哦!那么,在Android里面怎么使用呢?
(三) 怎么使用UncaughtExceptionHandler
1. 首先,我们得建立一个UncaughtExceptionHandler的具体类,好比:php
复制内容到剪贴板
代码:
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance; //单例引用,这里咱们作成单例的,由于咱们一个应用程序里面只须要一个UncaughtExceptionHandler实例
private CrashHandler(){}
public synchronized static CrashHandler getInstance(){ //同步方法,以避免单例多线程环境下出现异常
if (instance == null){
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx){ //初始化,把当前对象设置成UncaughtExceptionHandler处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) { //当有未处理的异常发生时,就会来到这里。。
Log.d("Sandy", "uncaughtException, thread: " + thread
+ " name: " + thread.getName() + " id: " + thread.getId() + "exception: "
+ ex);
String threadName = thread.getName();
if ("sub1".equals(threadName)){
Log.d("Sandy", ""xxx);
}else if(){
//这里咱们能够根据thread name来进行区别对待,同时,咱们还能够把异常信息写入文件,以供后来分析。
}
}
}
2. 其次,咱们自定义Application类
复制内容到剪贴板
代码:
public class OurApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler handler = CrashHandler.getInstance();
handler.init(getApplicationContext()); //在Appliction里面设置咱们的异常处理器为UncaughtExceptionHandler处理器
}
}
3. 配置AndroidManifest.xml文件
因为咱们使用自定义的Application,因此咱们要在AndroidManifest.xml文件中申明它
复制内容到剪贴板
代码:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name=".OurApplication"
android:debuggable="true"
>
4. 测试
咱们在Activity里面启动一个线程,而后线程里面抛出一个异常,看看程序会怎么样
复制内容到剪贴板
代码:
Button btn = (Button) findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.d("Sandy", "I am a sub thread");
String s = null;
s.toString(); //抛出NullPointException
}
}, "sub thread");
thread.start();
}
5. 结果
因为咱们有默认未处理异常的处理程序,因此会打印下面的日志信息,而不会抛出异常致使程序异常终止
D/Sandy ( 2228): I am a sub thread
D/Sandy ( 2228): uncaughtException, thread: Thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.NullPointerExceptionhtml
转载:http://bbs.51cto.com/thread-1037088-1.htmljava