经验总结—Activity是否被销毁判断条件

5,628 阅读1分钟

应用场景

在实际项目中,异步请求网络数据返回结果后,需要在UI线程中进行View数据填充操作。最开始我使用!isFinishing( )来判断Activity是否存活,如果未被销毁,就执行填充数据方法。但是在bugly上偶尔会出现零星的crash,报View的NPE。因此,isFinishing( )在某些情况下,并不能判断Activity是否被销毁。

正确判断条件

/**
 * Activity是否已被销毁
 * @return
 */
public boolean isActivityEnable(){
    if(this == null || isDestroyed() || isFinishing()){
        return false;
    }
    return true;
}

Fragment中

public boolean isActivityEnable(){
    return getActivity()!=null && !getActivity().isDestroyed() 
               && !getActivity().isFinishing()&& isAdded();
}

问题原因

isFinishing()返回值为mFinished。mFinished是在finish()中被赋值的,也就是说只有通过调用finish()结束的Activity,mFinished的值才会被置为true。所以有时候Activity的生命周期没有按我们预想的来走时(如内存紧张时),会出现判断出错的情况。