第一 ?項(xiàng)目中出現(xiàn)的問(wèn)題
android的項(xiàng)目中,難免會(huì)使用fragment,也會(huì)使用sp來(lái)保存一些設(shè)置。但在fragment使用sp中的時(shí)候會(huì)面臨
內(nèi)存不夠的時(shí)候被回收的問(wèn)題,這個(gè)時(shí)候程序就會(huì)崩潰的情況,即使有全局異常來(lái)處理,但不可避免造成不好
的用戶體驗(yàn)。
第二 ?問(wèn)題探究
在fragment使用上下文,一般有兩種方式,一種是使用activity,另一種是使用application。
使用activity的話,一般是getActivity(),或者采取構(gòu)造方法來(lái)進(jìn)行傳遞,這樣的方法都可以,但
無(wú)論是哪種都會(huì)面臨失效為null的情況。原因相信大家都知道,fragment依附于activity存活。
內(nèi)存不夠的時(shí)候,activity都會(huì)干掉,何況依附于他的小弟。
另一種是application是跟程序的生命周期綁定的,這個(gè)最為穩(wěn)妥,但在組件中的量級(jí)也最為重
不是特別的時(shí)候,盡量不要使用,但應(yīng)對(duì)崩潰的情況沒辦法的話也可以應(yīng)急一下。
第三 ? ?項(xiàng)目的解決方案-只是自己的方法
個(gè)人覺得比較好的方法最好是合二為一,這樣既可以避免過(guò)多使用application,也可以在一定程度上避免
空指針的出現(xiàn)。
首先,針對(duì)application建立單例模式,這個(gè)作用就不說(shuō)了,相信通用的程序都是這樣做的
private static MyApplication instance;
public ?static MyApplication getinstance() {
? ? ? ? ?if (instance == null) {
? ? ? ? ? ? instance = new MyApplication();
}
? ?return instance;
}
接著,一般的話為進(jìn)行統(tǒng)一樣式的設(shè)置或者一些主題的設(shè)置,都會(huì)統(tǒng)一建立BaseFragment, 在里面加入這個(gè)方法,
private ?Activity activity;
public ? Context getContext(){
? ? ? ? ?if(activity == null){
? ? ? ? ? ? ?return MyApplication.getinstance();
}
? ?return ? activity;
}
上面的代碼相信小伙伴們都能看懂,當(dāng)出現(xiàn)activity為空的時(shí)候,就去使用application應(yīng)急,一般的話就用activity最為合適。連著結(jié)合起來(lái)進(jìn)行判斷,當(dāng)然根據(jù)自己的需求可以加入onAttach(),去得到activity
@Override
public void onAttach(Activity activity) {
? ? ? ?super.onAttach(activity);
? ? ? ?activity = getActivity();
}
上面的方法是自己的項(xiàng)目在迭代的時(shí)候出現(xiàn)的問(wèn)題,之前用的是getActivity(),但是程序用個(gè)幾個(gè)小時(shí),再次打開的就呵呵了,收集錯(cuò)誤日志的時(shí)候發(fā)現(xiàn)是這個(gè)毛病,現(xiàn)在依照這樣弄就沒事了。
分享項(xiàng)目中bug,牽扯到原理的一些地方我也不是很了解,有錯(cuò)誤的地方,還請(qǐng)地方指正留言。
小弟在此拜謝了。