1. 程式人生 > >Android開發-新建線程崩潰

Android開發-新建線程崩潰

cti 網上 todo ins ini 時間 lin get oid

  一直不滿意車機不能實現屏保,最近發現可以通過設置亮度實現,顧萌生了自己寫程序的來實現的念頭,遂修改原來練手的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開發-新建線程崩潰