На андроиде есть некоторые особенности, которые я ненавижу, как ад ...
Проблемы вокруг 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- До того, как я добавил !this.isFinishing()
в if, исключение было гораздо более частым, но все еще не решило его 100% 2- согласно Crashlytics 97% находятся на фоне, когда это происходит, поэтому я ДУМАЮОда запускается, пользователь переходит в фоновый режим, затем он просто вылетает
вопрос в том ... как правильно решить эту проблему ... я ненавижу ловить исключения для предсказуемых ситуаций