Вы можете добавить caller.isDetached()
к условию обратного вызова. Как вы упомянули, but the user might "go back" and detach the fragment at any time.
в этом случае вы бы не хотели, чтобы фрагмент все равно получал обратный вызов. Если вы хотите обработать ответ независимо от фрагмента, вы должны вызывать его не из фрагмента, а из другого места, более устойчивого. В этом случае я бы предложил не включать фрагмент в logi c запроса, а только обратный вызов, на который может зарегистрироваться любой вызывающий объект.
для вашего последующего вопроса:
Фрагмент или тот, кому нужно получить ответ, должен реализовать интерфейс обратного вызова. Например:
1. объявить интерфейс с именем INetworkListener
с методом onResponse(Response response)
2. FragmentX реализует INetworkListener
3. В FragmentX переопределить onResponse (ответ ответа) и обработайте ответ там
4. Когда вы делаете сетевой вызов вместо фрагмента и обратного вызова в качестве аргументов, используйте аргумент callback
типа INetworkListener
(который является тем, кто реализует этот интерфейс, в нашем случае, фрагмент. Поэтому, если вызывается из фрагмента, аргумент будет быть this
.
5. внутри вашей функции вызова, когда ответ готов, вызовите callback.onResponse(response)
, как вы делаете сейчас, и фрагмент получит его в методе onResponse (), который его переопределяет.
Чем оно отличается от того, что есть у вас сейчас? Ну, технически это не так.
По сути, передача фрагмента в качестве аргумента может быть источником утечек памяти и не очень хорошая практика. .
Это важно при выполнении вызова. Например, если вы вызываете его во фрагменте onCreate
, ответ может вернуться до того, как фрагмент будет прикреплен.
Проблема с вашим кодом состоит в том, что он не с учетом состояния фрагмента перед доступом к его интерфейсу.
Если вы хотите обновить фрагмент после его возобновления, вы можете использовать команду ca Вернемся к проверке типа if (!fragment.isAdded) return
перед обновлением пользовательского интерфейса фрагмента в ответ, если фрагмент был отсоединен.
Но если вы хотите загрузить фрагмент с данными, я бы порекомендовал подготовить сетевые данные. заранее инициализировать фрагмент с данными и НЕ использовать обратный вызов для фрагмента для этой цели.