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;
}
https://www.jianshu.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”的问题。
作者:独毒火
链接:https://www.jianshu.com/p/7986206aa9d4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
网友评论