应用场景
在实际项目中,异步请求网络数据返回结果后,需要在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的生命周期没有按我们预想的来走时(如内存紧张时),会出现判断出错的情况。