0
点赞
收藏
分享

微信扫一扫

Android中getActivity()为null

Greatiga 2022-02-08 阅读 40

通过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开发上走得更远。

举报

相关推荐

0 条评论