安卓上有一些我讨厌的特殊之处......
围绕活动isFinishing()
的问题是最糟糕的。
我确实知道在此过程中之后或过程中不允许某些操作,但是我们必须检查它的唯一方法是通过这种方法,并且有些它无效,让我展示一个非常简单的示例,请指导我如何使用最佳实践来解决它:
我想在屏幕上添加片段
if(!this.isFinishing() && getSupportFragmentManager().findFragmentByTag(VerifyIdentityDialog.CHALLENGE_DIALOG_TAG) == null)
try {
new VerifyIdentityDialog((ChallengeRequiredException) e, new DefaultVerifyIdentityListener())
.show(getSupportFragmentManager(), VerifyIdentityDialog.CHALLENGE_DIALOG_TAG);
} catch (Exception e1) {
Crashlytics.logException(e1);
}
这段代码仅在它显式检查活动是否在尝试之前完成MainThread
上运行,但我仍然有大约 2% 的用户遇到异常......
例外情况是:
java.lang.IllegalStateException
Can not perform this action after onSaveInstanceState
[避免粘贴长堆栈跟踪,因为它是默认的android异常,并且上面提到了相关代码]
1-在我在if中添加!this.isFinishing()
之前,异常更频繁,但仍然没有100%解决 2-根据Crashlytics的说法,97%在发生时都在后台,所以我认为代码启动,用户进入后台然后它只是崩溃
问题是... 如何解决它的正确方法...我讨厌在可预测的情况下捕获异常
你可以通过isStateSaved()直接检查FragmentManager是否保存了它的状态 - 只有在状态没有保存的情况下,你才应该show()
你的对话框。