最近時(shí)間不是很緊張(10106還真是不太好受的如筛,哈哈。抒抬。)杨刨,有了罕見(jiàn)的雙休,正好周六是和女票的六周年紀(jì)念日擦剑,這要是周六再加班妖胀,就真是“怪不得程序員沒(méi)有女朋友了”,先放個(gè)美食圖:
三里屯的將太無(wú)二店惠勒,味道還可以赚抡,三文魚(yú)刺身我喜歡。纠屋。
今天要說(shuō)的是在Android應(yīng)用中因?yàn)闆](méi)有捕獲異常而導(dǎo)致程序崩潰的問(wèn)題涂臣。
先看張圖(隨便找的):
在應(yīng)用運(yùn)行過(guò)程中,有很多異辰碓猓可能會(huì)發(fā)生肉康,一般情況我們會(huì)自己處理異常情況,但是也不能面面俱到灼舍,而我們希望在沒(méi)有被捕獲的異常發(fā)生的時(shí)候盡量做到不要讓程序崩潰吼和,并且需要在第一時(shí)間保存現(xiàn)場(chǎng),必要時(shí)將log信息上傳到server骑素,以便在后期版本中修復(fù)炫乓。
如何處理未捕獲的異常呢?
- 首先是定義一個(gè)類献丑,我們?nèi)∶麨椋篊rashHandler末捣,然后實(shí)現(xiàn)一個(gè)接口 java.lang.Thread.UncaughtExceptionHandler,要實(shí)現(xiàn)該接口里面的uncaughtException(Thread t, Throwable e)方法 创橄,在這個(gè)函數(shù)里面箩做,我們可以做一些處理,例如將異常信息保存到sdcard上的某個(gè)位置妥畏,或者提示用戶異常出現(xiàn)等等一些操作等邦邦。
代碼:
/**
* crash異常log捕獲
* 捕獲到的log會(huì)保存到sdcard文件里
* @author qizhenghao
*/
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance;
private Context context;
/** 系統(tǒng)默認(rèn)的UncaughtException處理類 */
private Thread.UncaughtExceptionHandler defaultHandler;
// 單例
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
// 初始化
public void init(Context context) {
this.context = context;
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
DownloadManager.getInstance().clearNotification();
if (!handleException(arg1) && defaultHandler != null) {
// 如果用戶沒(méi)有處理則讓系統(tǒng)默認(rèn)的異常處理器來(lái)處理
defaultHandler.uncaughtException(arg0, arg1);
} else {
// 退出進(jìn)程
System.exit(16);
}
}
// 處理異常
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
ex.printStackTrace();
//保存log信息到本地文件
Methods.logCrashOnFile(context, ex);
// 等待1s
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
// 關(guān)閉進(jìn)程
int nPid = android.os.Process.myPid();
android.os.Process.killProcess(nPid);
return true;
}
其中Thread.setDefaultUncaughtExceptionHandler(this);是最關(guān)鍵的一行代碼了。
- 其次醉蚁,在Application的onCreate()方法中進(jìn)行注冊(cè):
public class ExcApplication extends Application {
@Override
public void onCreate() {
CrashHandler.getInstance().init(getApplicationContext());
}
}
- 最后燃辖,這個(gè)活兒其實(shí)可以交給第三方服務(wù)來(lái)干,如:友盟网棍。
下面是友盟的截圖:
具體demo還是參考友盟官方的:http://dev.umeng.com/analytics/android-doc/integration?spm=0.0.0.0.1HjVlF
就這樣啦黔龟,這個(gè)問(wèn)題對(duì)于初學(xué)者還是要了解一下,一般在APP的設(shè)計(jì)之初架構(gòu)師早就設(shè)計(jì)好了。但是話又說(shuō)回來(lái)氏身,說(shuō)不好哪天你心血來(lái)潮自己整個(gè)線上的APP了呢巍棱?提前恭喜你吧??