问题解决:Fragment not attached to Activity

1、问题引入

在Fragment中执行一段耗时任务,在任务未结束的时候,重建Activity就会导致getActivity()为null,所有用到getActivity()的地方都会引起空指针异常,如果使用了getResources()方法,就会导致Fragment not attached to Activity。

2、问题解决

将FirstFragment中onPostExecute()方法中的
tvMsg.setText(getResources().getString(R.string.app_name));

改为
if (isAdded()) {
tvMsg.setText(getResources().getString(R.string.app_name));
}
2或者用getContext()代替

3在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity(),保证Fragment即使在onDetach后,仍持有Activity的引用(有引起内存泄露的风险,但是异步任务没停止的情况下,本身就可能已内存泄漏,相比Crash,这种做法“安全”些),即:
protected Activity mActivity;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity = activity;
}

/**

  • 如果你用了support 23的库,上面的方法会提示过时,有强迫症的小伙伴,可以用下面的方法代替
    */
    @Override
    public void onAttach(Context context) {
    super.onAttach(context);
    this.mActivity = (Activity)context;
    }
    //www.greatytc.com/p/d9143a92ad94

isAdded()方法可以判断当前的Fragment是否已经添加到Activity中,只有当Fragment已经添加到Activity中时才执行getResources()等方法。
另请参考:http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity

当然,以上只是引起该异常的一个例子,并不能解决所有“Fragment not attached to Activity”的问题。

作者:独毒火
链接://www.greatytc.com/p/7986206aa9d4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容