第一 項目中出現的問題
android的項目中,難免會使用fragment,也會使用sp來保存一些設置。但在fragment使用sp中的時候會面臨
內存不夠的時候被回收的問題,這個時候程序就會崩潰的情況,即使有全局異常來處理,但不可避免造成不好
的用戶體驗。
第二 問題探究
在fragment使用上下文,一般有兩種方式,一種是使用activity,另一種是使用application。
使用activity的話,一般是getActivity(),或者採取構造方法來進行傳遞,這樣的方法都可以,但
無論是哪種都會面臨失效爲null的情況。原因相信大家都知道,fragment依附於activity存活。
內存不夠的時候,activity都會幹掉,何況依附於他的小弟。
另一種是application是跟程序的生命週期綁定的,這個最爲穩妥,但在組件中的量級也最爲重
不是特別的時候,儘量不要使用,但應對崩潰的情況沒辦法的話也可以應急一下。
第三 項目的解決方案-只是自己的方法
個人覺得比較好的方法最好是合二爲一,這樣既可以避免過多使用application,也可以在一定程度上避免
空指針的出現。
首先,針對application建立單例模式,這個作用就不說了,相信通用的程序都是這樣做的
private static MyApplication instance;
public static MyApplication getinstance() {
if (instance == null) {
instance = new MyApplication();
}
return instance;
}
接着,一般的話爲進行統一樣式的設置或者一些主題的設置,都會統一建立BaseFragment, 在裏面加入這個方法,
private Activity activity;
public Context getContext(){
if(activity == null){
return MyApplication.getinstance();
}
return activity;
}
上面的代碼相信小夥伴們都能看懂,當出現activity爲空的時候,就去使用application應急,一般的話就用activity最爲合適。連着結合起來進行判斷,當然根據自己的需求可以加入onAttach(),去得到activity
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
activity = getActivity();
}
上面的方法是自己的項目在迭代的時候出現的問題,之前用的是getActivity(),但是程序用個幾個小時,再次打開的就呵呵了,收集錯誤日誌的時候發現是這個毛病,現在依照這樣弄就沒事了。
分享項目中bug,牽扯到原理的一些地方我也不是很瞭解,有錯誤的地方,還請地方指正留言。
小弟在此拜謝了。
簡書地址:https://www.jianshu.com/p/eb9e0bd5f623