getActivity() имеет значение null внутри обработчика

#android

#Android

Вопрос:

У меня есть приложение с одним действием и двумя фрагментами. Фрагмент B добавляется (addedToBackStack) поверх фрагмента A. Во фрагменте B я показываю диалоговое окно, возвращаюсь к фрагменту A и затем закрываю диалоговое окно. Если getActivity()!=null проверка удалена внутри обработчика, код работает нормально. Но getActivity() имеет значение null внутри обработчика. Почему getActivity() null внутри обработчика в следующем фрагменте кода?

  private void showDialog(final Dialog dialog) {
    dialog.show();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (getActivity()!=null amp;amp; !getActivity().isFinishing()) {
                dialog.dismiss();
            }
        }
    }, 1000);
    if (getActivity() != null amp;amp; !getActivity().isFinishing())
        getActivity().onBackPressed();
}
 

Ответ №1:

getActivity() имеет значение null, потому что после getActivity().onBackPressed(); вызова ваш фрагмент будет отделен от Activity . Таким образом, внутри обработчика он всегда будет иметь значение null, потому что он вызывается с задержкой. Если вы хотите закрыть диалоговое окно через одну секунду, а также вернуться к предыдущему фрагменту, то вам следует перейти onBackPressed внутрь метода run. я заменил нулевую проверку на isAdded() .

 private void showDialog(final Dialog dialog) {
    dialog.show();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (isAdded()) {
                dialog.dismiss();
                getActivity().onBackPressed();
            }
        }
    }, 1000);
}
 

Комментарии:

1. Но как работает код, если в моем коде удалена проверка getActivity()? будет ли диалоговое окно содержать экземпляр даже после уничтожения фрагмента?

2. isAdded() делает то же самое . Он проверяет, что Фрагмент присоединен к действию, если нет, то он вернет false .