Android Фрагмент isAdded возвращает false, а getActivity становится пустым после публикации потока в методе onResume. - PullRequest
1 голос
/ 23 февраля 2020

Так что я использую Навигацию в своей основной деятельности моего приложения, и у меня есть фрагмент, который является моим начальным фрагментом навигации.

В этом фрагменте, после его создания, в моем докладчике я публикую тему в получить данные из сети. После получения данных я использую основной поток для отображения данных на экране.

При первом запуске приложения это работает нормально.

Однако, если пользователь открывает Ящик и снова выбирает ЭТОТ фрагмент, а не другой, фрагмент воссоздается заново, что означает, что он уничтожается и создается с нуля, так как компонент навигации предназначен для этого.

Однако на этот раз, когда мой докладчик публикует данные извлечения потока -thread, и это завершается и отправляет результаты в пользовательский интерфейс, метод isAdded () фрагмента возвращает false, а getActivity имеет значение null.

Имея это, я не могу использовать Контекст деятельности (getActivity ( ) имеет значение null или requireActivity () генерирует недопустимое исключение состояния) и, следовательно, я не могу загрузить изображения и т. д. c, поскольку у меня нет доступного контекста.

Я подчеркиваю, что это происходит, когда пользователь открывает ящик, пока этот фрагмент виден и выбирает снова, чтобы перейти к этому фрагменту из ящика. Если пользователь переходит к другому фрагменту и затем нажимает кнопку «Назад», все в порядке.

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Итак, после тестирования и поиска я выяснил причину проблемы, которую я описал выше.

Я аннулирую представление моего докладчика в методе onDestroy / onDetach моего фрагмента. Однако когда создается замещающий фрагмент, этот новый фрагмент сначала присоединяется к вызывающей операции, а затем старый уничтожается.

Имея в виду, что я ввожу своего докладчика в экземпляр Fragment, мой докладчик никогда не будет иметь нулевого значения в момент присоединения нового фрагмента и, следовательно, и, учитывая, что я создаю новый экземпляр моего Presenter, когда он имеет значение null, экземпляр презентатора, который внедряется во фрагмент, не знает о новом объекте 'View'.

В результате, когда результаты достигают потока пользовательского интерфейса через обратный вызов, этот объект представления 'не Добавлен».

0 голосов
/ 23 февраля 2020

Фрагменты предназначены для уничтожения, а также для действий. Вы никогда не можете положиться на состояние жизненного цикла компонента android, и из-за этого android компоненты архитектуры были сделаны . Например, ViewModel может пережить фрагмент своего хоста.

Но - viewmodel / Presenter / controller не является подходящим местом для выполнения сетевого запроса и обработки логики приложения c, просто потому что это не их работа (SOLID х S -единственная ответственность).

Существует официальное руководство по архитектуре приложения. Проще говоря, у вас есть слой для кода android, в котором вы обновляете пользовательский интерфейс, слой для обработки логики приложения c (который не зависит от java / kotlin и android framework) и слой для запроса / хранения данных , Таким образом, при создании вашего пользовательского интерфейса вы получаете viewmodel, которая имеет ссылку на класс, который обрабатывает logi c и предоставляет результат для визуализации в пользовательском интерфейсе. Внутренние слои сохраняются - вид нет.

...