轉(zhuǎn)自
問題
如何避免應(yīng)用因?yàn)橐恍┬ug導(dǎo)致app崩潰
舉例:某次熱修復(fù)發(fā)布诅病,增加埋點(diǎn)日志碌宴,出現(xiàn)空指針問題育勺,大量不影響用戶操作的異常如果沒有進(jìn)行捕獲崭庸,可能會導(dǎo)致嚴(yán)重故障梳玫。
思路
1.Android中線程無限循環(huán)執(zhí)行隊(duì)列任務(wù)
2.主線程不結(jié)束意味著app存活
3.子線程需要結(jié)束,不然會導(dǎo)致子線程數(shù)無限增長治宣,app最后無法生存
4.接管Looper保證某線程不死急侥,忽然想到,這個思路可以用于某些子線程內(nèi)部蔽暄活
代碼
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, final Throwable e) {
if (t == Looper.getMainLooper().getThread()) {
Toast.makeText(App.this, "主線程出現(xiàn)錯誤:" + e.getMessage(), Toast.LENGTH_SHORT).show();
while (true) {
try {
Looper.loop();
} catch (Throwable e1) {
Toast.makeText(App.this, "主線程出現(xiàn)錯誤:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
} else {
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(App.this, "子線程出現(xiàn)錯誤:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
}
備注
1.如果崩潰發(fā)生的Runnable在activity或fragment的生命周期中坏怪,可能會導(dǎo)致生命周期無法執(zhí)行完畢,因?yàn)榇薘unnable因?yàn)楸罎o法執(zhí)行下去豌拙。但是app未死亡陕悬。
2.推薦liveData.postValue + Cockroach,liveData的原理為不斷拋出小Runnerable執(zhí)行UI任務(wù)