(一) 前言
各位親愛的午飯童鞋,是不是經常因爲自己的程序中出現未層捕獲的異常導致程序異常終止而痛苦不已?嗯,是的。。 但是,大家不要怕,今天給大家分享一個東東可以解決大家這種困擾,吼吼!
(二) UncaughtExceptionHandler接口
這個接口,顧名思義,就是處理程序中沒有處理的異常,而且是在系統拋出異常導致程序異常終止之前哦!那麼,在Android裏面怎麼使用呢?
(三) 怎麼使用UncaughtExceptionHandler
1. 首先,咱們得創建一個UncaughtExceptionHandler的具體類,比如:
複製內容到剪貼板
代碼:
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.NullPointerException
大家還等什麼呢?趕緊在自己的應用裏面添加上默認未處理異常處理器吧!再也不會因爲異常未捕獲發生程序崩潰了。。^_^
---------------------
作者:RongSilent的祕密花園
來源:CSDN
原文:https://blog.csdn.net/mr_jianrong/article/details/75270860
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!