1、問(wèn)題引入
在Fragment中執(zhí)行一段耗時(shí)任務(wù),在任務(wù)未結(jié)束的時(shí)候,重建Activity就會(huì)導(dǎo)致getActivity()為null,所有用到getActivity()的地方都會(huì)引起空指針異常,如果使用了getResources()方法,就會(huì)導(dǎo)致Fragment not attached to Activity。
2、問(wèn)題解決
將FirstFragment中onPostExecute()方法中的
tvMsg.setText(getResources().getString(R.string.app_name));
改為
if (isAdded()) {
tvMsg.setText(getResources().getString(R.string.app_name));
}
2或者用getContext()代替
3在Fragment基類(lèi)里設(shè)置一個(gè)Activity mActivity的全局變量,在onAttach(Activity activity)里賦值,使用mActivity代替getActivity(),保證Fragment即使在onDetach后,仍持有Activity的引用(有引起內(nèi)存泄露的風(fēng)險(xiǎn),但是異步任務(wù)沒(méi)停止的情況下,本身就可能已內(nèi)存泄漏,相比Crash,這種做法“安全”些),即:
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity = activity;
}
/**
- 如果你用了support 23的庫(kù),上面的方法會(huì)提示過(guò)時(shí),有強(qiáng)迫癥的小伙伴,可以用下面的方法代替
*/
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = (Activity)context;
}
http://www.itdecent.cn/p/d9143a92ad94
isAdded()方法可以判斷當(dāng)前的Fragment是否已經(jīng)添加到Activity中,只有當(dāng)Fragment已經(jīng)添加到Activity中時(shí)才執(zhí)行g(shù)etResources()等方法。
另請(qǐng)參考:http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity
當(dāng)然,以上只是引起該異常的一個(gè)例子,并不能解決所有“Fragment not attached to Activity”的問(wèn)題。
作者:獨(dú)毒火
鏈接:http://www.itdecent.cn/p/7986206aa9d4
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。