亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android主線程崩潰與子線程崩潰有的本質區別是什么

發布時間:2021-10-21 13:48:44 來源:億速云 閱讀:242 作者:iii 欄目:移動開發

這篇文章主要介紹“Android主線程崩潰與子線程崩潰有的本質區別是什么”,在日常操作中,相信很多人在Android主線程崩潰與子線程崩潰有的本質區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android主線程崩潰與子線程崩潰有的本質區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

問答環節

問:Android 主線程崩潰與子線程崩潰有什么本質區別?

答:子線程崩潰就是正常的 Java thread 樣子,通過 setDefaultUncaughtExceptionHandler 就能捕獲  ThreadGroup 里對應子線程的異常做后續處理(啟動獨立進程提醒用戶并上報平臺等,或者通過策略下發忽略特定異常當作沒發生一樣)。安卓中主線程的 Crash  和子線程 Crash 有一點差異,雖然本質都是通過 setDefaultUncaughtExceptionHandler  就能捕獲,但是這背后其實是有一點竅門的。由于 Android 主線程啟動后通過 MainHandler 的 Looper.loop()  一直保持管道阻塞式的生產消費者死循環,所有的主線程代碼都是通過這個循環派發在 MainLooper 中執行的,所以當主線程 crash  的場景下,這個循環會被跳出,導致 Looper 無法再繼續執行其中的其他 Message,所以當主線程 crash 時會出現幾種不同的表現,場景的一種就是在  Activity 的 onCreate 中 crash 會導致界面黑屏(注意,這種 crash 不是 anr,是因為 onCreate  中拋出異常導致后續代碼無法執行,也就是 Activity 生命周期框架代碼無法繼續,同時后續 Message 也無法正常派發,所以界面還沒出來就黑屏了),而  View 點擊事件響應中 crash 可能不會黑屏(也可能會,取決于做什么操作),但是后續 Message 也是無法正常派發。

拓展環節
問:針對上面描述你有什么想法?

答:子線程奔潰沒啥說的,由于主線程發生了崩潰會導致 Looper 退出,所以我們可以在主線程啟動一個我們自帶 try-catch 的  Looper.loop() 去執行主線程任務,相當于這樣我們通過帶 try-catch 的 loop() 替換掉了 ActivityThread main  里面那個 Looper.loop(),這樣就不會出現主線程崩潰后 loop 退出了,也就能繼續執行代碼了,只是當次 crash  的場景可能是無效的,譬如用戶點擊按鈕設置文案 crash 了,點了可能沒反應;同時點擊按鈕啟動的 Activity 的 onCreate 等方法里面有  crash 則會導致黑屏,所以這種 crash 需要區分對待(譬如上報異常并彈框提醒并直接殺掉進程等)。

下面是核心代碼的簡單實現(Activity 生命周期處理的比較粗略,僅供 demo):

// Application 啟動就進行替換 new Handler(getMainLooper()).post(new Runnable() {     @Override     public void run() {         // 每次蹦了就繼續重新循環,保證永遠都能 loop         while (true) {             try {                 Looper.loop();             } catch (Throwable e) {                 e.printStackTrace();                 // TODO 手動上報錯誤到異常管理平臺,做交互處理等                 if (e.getMessage() != null && e.getMessage().startsWith("Unable to start activity")) {                     // TODO 來自 Activity 生命周期崩潰,殺死進程                     android.os.Process.killProcess(android.os.Process.myPid());                     break;                 }             }         }     } });

當然,針對 Activity 生命周期方法內的 crash 黑屏我們除過判斷堆棧日志方式,還能通過 hook  ActivityThread 的 mH 主 Handler 實現,將里面的 Message handle 函數托管我們實現,然后進行 try-catch  捕獲,發現異常就 close 對應 Activity 或者 kill app 即可

到此,關于“Android主線程崩潰與子線程崩潰有的本質區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰和县| 弋阳县| 称多县| 菏泽市| 扶绥县| 张家界市| 连平县| 汉寿县| 奉新县| 牡丹江市| 清原| 洪江市| 霸州市| 资中县| 五大连池市| 明光市| 清新县| 陕西省| 朝阳市| 临高县| 和龙市| 敦化市| 宜良县| 墨玉县| 台南市| 延川县| 岗巴县| 荔波县| 宜州市| 苏州市| 安新县| 思茅市| 邹城市| 池州市| 前郭尔| 平南县| 兴化市| 越西县| 文水县| 宝兴县| 视频|