Android-Application被回收引發(fā)異常分析

Hi All,
今天收到反饋的一個問題,說單例里面報了一個空指針導致項目會crash掉,所以今天分析了一下,感覺有借鑒意義

原因

直觀的分析日志可以看到是因為單例里面的一個static的參數(shù)confignull導致的問題。

正常流程

1、設備入口
2、onCreate()方法里面調用單例init方法把參數(shù)傳給單例 3、頁面里面需要單例的方法直接獲取這個單例 4、然后在退出登陸或者其他情況把單例destory() `

分析問題和猜測

  • 問題:按照正常的流程是不會出現(xiàn)config為空的問題,除非是單例銷毀了。單例銷毀的可能性按照正常的流程會重新走入口頁面重新獲取conifg不會有問題。
  • 猜測:App切換到后臺后,一段時間不操作,再切回來,很容易就發(fā)生崩潰(配置低的手機這種問題出現(xiàn)更頻繁)。究其原因,是因為常常把對象存儲在全局變量里面(這里是單例里面),而App切換到后臺后,進程很容易就被系統(tǒng)回收了,下次切換回來的時候App頁面再重建,但是系統(tǒng)重建的App對于原來存儲的全局變量卻無能為力。
  • 結論:經(jīng)模擬和猜測相符(詳細復現(xiàn)步驟見下文)。

復現(xiàn)問題

第一步:打開App到門禁流程中需要單例DataSourceInstance的界面。
第二步:按Home鍵退出應用。
第三步:使用DDMS-Stop Process結束進程。
第四步:回到項目應用中,正常使用(注:現(xiàn)在處于一個新的Application中,沒有之前操作存儲的數(shù)據(jù)了) 復現(xiàn)了出現(xiàn)該崩潰,驗證了猜想。

解決辦法

1、不在進入的入口頁進行init操作,放在Application中初始化。(目前的處理辦法)
因為每次App被回收重建的時候都會執(zhí)行onCreate方法。這樣就會避免這樣的問題
2、本地存儲(不建議使用,不具有實時性)
3、用dagger進行參數(shù)和對象的注入,不設置全局的變量,動態(tài)按需注入。
原因和第一步一樣,dagger是在applicationinit的。當頁面中需要注入的參數(shù)沒有就會new一個新的。
4、當然還有其他的解決方案,歡迎討論。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容