Hi All,
今天收到反饋的一個問題,說單例里面報了一個空指針導致項目會crash掉,所以今天分析了一下,感覺有借鑒意義
原因
直觀的分析日志可以看到是因為單例里面的一個static的參數(shù)config為null導致的問題。
正常流程
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是在application中init的。當頁面中需要注入的參數(shù)沒有就會new一個新的。
4、當然還有其他的解決方案,歡迎討論。