問(wèn)題解決:Fragment not attached to Activity

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)并注明出處。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容