通过bugly,追踪到一个崩溃,发现问题为在Fragment里getActivity()为null后崩溃。
于是,深层次找原因。
发现根本原因为:JVM在内存不足的情况下,会把Activity回收;而Frament和Activity的声明周期不一致,此时Frament不一定会被回收;因此,才导致getActivity()为null的问题。
Activity生命周期如下:
Fragment的生命周期如下:
因此,可以用的解决方法是:对Activity添加引用,保证Acitivity不被销毁。
添加引用方法为:
1)在onAttach时添加引用;
2)在onDetach时销毁引用。
代码如下:
public class MyFragment extends Fragment {
protected FragmentActivity mActivity; //可以用的引用
@Override
public void onAttach(Context context) {
super.onAttach(context);
//添加引用
if (context instanceof Activity){
mActivity =(FragmentActivity) context;
}
}
@Override
public void onDetach() {
super.onDetach();
//销毁引用
mActivity = null;
}
}
在子Fragment里,可以直接用protected类型的mActivity。
当然,也可以用单例或者其他的方法,方法均是避免Activity被回收。
PS:目前主流Android开发,很大一部分是是JAVA开发;JAVA的JVM机制,在带来开发的便利的同时,也带来了各种不变。在开发的时候,应该注意JVM机制,才可以在Android的JAVA开发上走得更远。