项目中有个问题,一直报一个fragment为空,即空指针异常,刚开始我以为只要有Activity存在Fragment中getActivity就不会为null,所以怎么也找不出原因。
后来才知道。。原来报这个错误是因为在后台运行的时候,这个fragment依附的Activity因系统内存不足被回收了,所以getActivity为null。
后来才知道。。原来报这个错误是因为在后台运行的时候,这个fragment依附的Activity因系统内存不足被回收了,所以getActivity为null。
解决方法:
1:在使用Fragment的Activity
中重写onSaveInstanceState
方法,将super.onSaveInstanceState(outState)
注释掉,让其不再保存Fragment
的状态,达到其随着MainActivity
一起被回收的效果。
方案2:在再次启动Activity
的时候,在onCreate
方法中将之前保存过的fragment
状态清除,代码示例如下:
if(savedInstanceState!= null)
{
//FragmentActivity的onSaveInstanceState方法可以看到,fragment保存时的标签是android:support:fragments
//FragmentActivity的onSaveInstanceState方法可以看到,fragment保存时的标签是android:support:fragments
String FRAGMENTS_TAG = "android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}
3:避免使用getActivity
方法得到activity,如果确实需要使用上下文,可以写一个类MyApplication继承Application,并且写一个方法getContext(),返回一个Context 对象。代码示例如下:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this;
}
public static Context getContext() {
return context;
}
}
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this;
}
public static Context getContext() {
return context;
}
}