Android開發-新建線程崩潰
一直不滿意車機不能實現屏保,最近發現可以通過設置亮度實現,顧萌生了自己寫程序的來實現的念頭,遂修改原來練手的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();
解決了兩個問題,線程崩潰的異常截獲,據原文描述,可以在主activity的OnCreate方法中添加下面代碼,就可以截獲所有線程發生時的異常,聽起來挺美好,不過我沒試,以後有需要再說吧。
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread thread, Throwable ex) { //任意一個線程異常後統一的處理 System.out.println(ex.getLocalizedMessage()); finish(); } });
至於第二個問題,不知道為何原來的代碼沒問題,現在就出現問題,也許是android studio和SDK升級了所致?反正沒時間深究。
Android開發-新建線程崩潰