Android: ошибка добавления фрагмента в активность - PullRequest
0 голосов
/ 15 апреля 2019

На андроиде есть некоторые особенности, которые я ненавижу, как ад ...

Проблемы вокруг 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% находятся на фоне, когда это происходит, поэтому я ДУМАЮОда запускается, пользователь переходит в фоновый режим, затем он просто вылетает

вопрос в том ... как правильно решить эту проблему ... я ненавижу ловить исключения для предсказуемых ситуаций

1 Ответ

0 голосов
/ 15 апреля 2019

Вы можете напрямую проверить, сохранил ли FragmentManager свое состояние с помощью isStateSaved () - вы должны только show() ваш диалог, если состояние не сохранено.

...