道歉,如果这个问题听起来非常基本。我有一个Activity
,它有一个异步网络回调。用户离开Activity后可以执行回调。
作为支票,我想使用isFinishing()
(我不能使用isDestroyed()
因为我的最低API级别是16而不是isDestroyed()
要求的17。
我可以在回调中使用isFinishing()
来确保我的逻辑仅在Activity未被销毁时执行吗?
更具体地说,即使在isFinishing()
被调用之后调用finish()
而被销毁的活动,onDestroy()
也会返回true?
我也看了一下源代码。这是isFinishing()
:
public boolean isFinishing() {
return mFinished;
}
这里是finish(),其中变量设置为true:
/**
* Finishes the current activity and specifies whether to remove the task associated with this
* activity.
*/
private void finish(boolean finishTask) {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (false) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (resultData != null) {
resultData.prepareToLeaveProcess();
}
if (ActivityManagerNative.getDefault()
.finishActivity(mToken, resultCode, resultData, finishTask)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
/**
* Call this when your activity is done and should be closed. The
* ActivityResult is propagated back to whoever launched you via
* onActivityResult().
*/
public void finish() {
finish(false);
}
我也看过Understanding of isFinishing() 但我似乎无法得出这个特定问题的答案。
答案 0 :(得分:3)
您的问题可能与任何答案一样好,因为Activity.isFinishing()
的{{3}}没有指定已经被破坏的Activity
的返回值。但是,根据javadoc来判断,似乎不容易引起混淆的mFinished
(由isFinishing()
使用)从未设置为false
(除了初始化)因此一旦设置为true
将始终保持该值。话虽如此,mFinished
是包私有的,所以理论上另一个类可以修改该值。在实践中,我认为如果isFinishing()
完成或已完成,Activity
会返回true,这是安全的。
换句话说,isFinishing() == isFinishing() || isDestroyed()
答案 1 :(得分:0)
我可以确认我用 (isFinishing() || isDestroyed)
替换了 isFinishing()
并且从 Glide 得到了一些 IllegalArgumentExceptions,错误是 You cannot start a load for a destroyed activity
。不是完美的证据,但足以让我相信,至少在某些平台/设备上,两者是不一样的。