成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android 主線程崩潰與子線程崩潰有什么本質區別?你是怎么處理的?

移動開發 Android
子線程崩潰就是正常的 Java thread 樣子,通過 setDefaultUncaughtExceptionHandler 就能捕獲 ThreadGroup 里對應子線程的異常做后續處理(啟動獨立進程提醒用戶并上報平臺等,或者通過策略下發忽略特定異常當作沒發生一樣)。

[[358857]]

問答環節

問: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):

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


當然,針對 Activity 生命周期方法內的 crash 黑屏我們除過判斷堆棧日志方式,還能通過 hook ActivityThread 的 mH 主 Handler 實現,將里面的 Message handle 函數托管我們實現,然后進行 try-catch 捕獲,發現異常就 close 對應 Activity 或者 kill app 即可,這個方案其實網上有現成的開源庫,大家可以去參考下。

本文轉載自微信公眾號「碼農每日一題」,可以通過以下二維碼關注。轉載本文請聯系碼農每日一題公眾號。 

 

責任編輯:武曉燕 來源: 碼農每日一題
相關推薦

2010-03-01 13:28:44

Python子線程

2025-04-17 07:41:07

進程線程窗口

2022-06-15 09:02:32

JVM線程openJDK

2024-09-13 09:06:22

2021-07-02 06:54:45

GoJavachannel

2010-02-24 11:19:00

Python主線程

2011-05-25 13:10:40

SQL ServerOracle

2022-03-16 07:33:40

守護線程用戶線程語言

2025-04-29 08:21:30

ANRAndroidUI

2011-05-27 09:19:32

Windows 7崩潰

2024-10-24 08:47:12

2024-07-15 08:20:24

2022-03-23 07:54:05

Java線程池系統

2009-07-12 13:55:29

2021-12-30 09:39:28

Android 12App開發者

2015-12-17 11:36:31

資本寒冬互聯網創業

2025-04-28 08:20:40

ndroid主線程線程

2014-07-23 10:53:30

聽云應用監控

2010-09-27 11:24:37

SQL聚簇索引

2023-12-11 08:03:01

Java線程線程組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 丁香久久 | 久久国产综合 | 我要看免费一级毛片 | 欧美不卡一区二区 | 亚洲日韩欧美一区二区在线 | 美女黄网 | 日韩精品成人一区二区三区视频 | 国产福利91精品一区二区三区 | 四虎永久在线精品免费一区二 | 久久久精品网 | 狠狠干夜夜草 | 免费午夜视频 | 成人二区 | 久久久久电影 | 成年人国产在线观看 | 欧美激情va永久在线播放 | 91精品久久久久久久久久 | 欧美日韩视频在线 | 国产在线二区 | 久久精品亚洲欧美日韩精品中文字幕 | 国产日韩欧美一区二区 | 国产午夜三级一区二区三 | 一区二区三区高清 | 国产 欧美 日韩 一区 | 国产精品久久国产精品 | 日韩久久久久久 | 国产日韩中文字幕 | 精品九九九| 亚洲欧美视频一区 | 在线播放中文字幕 | 国产伦精品一区二区三区照片91 | 欧美成人免费在线视频 | 嫩草研究影院 | 国产日韩欧美一区二区 | 特级特黄特色的免费大片 | 精品国产乱码久久久久久丨区2区 | 久久99国产精品 | 国产精品免费一区二区三区 | aaa大片免费观看 | 在线免费看毛片 | 亚洲综合色自拍一区 |