У меня есть фрагмент, и отображаемые данные получены из сетевого вызова.
Я использую onSaveInstanceState, чтобы избежать повторной выборки данных при изменении ориентации, но если я правильно понимаю жизненный цикл фрагментов, если приложение никогда не уничтожается (либо явно пользователем, либо потому, что ОС Android убивает активность из-за недостаток ресурсов) данные с сервера никогда не обновятся.
Если я правильно понял эту часть, мне нужно было бы определить какой-то способ периодического извлечения данных с сервера или есть другой способ?
Нет никаких правил обновления данных. Это зависит от вашего приложения, ваших данных и т. д. Если вы получаете список квитанций, вам не нужно реализовывать механизм обновления. Но если вы принесете, я не знаю, курс обмена валют, вы должны иметь его.
А как насчет паттерна потянуть, чтобы обновить?
Это зависит от того, где вы выполняете свой сетевой вызов: в onResume () вызов будет выполняться каждый раз, когда отображается фрагмент / действие; в onCreate () каждый раз, когда он создается
Но если я сделаю это onResume, то не будет ли он срабатывать при каждом изменении ориентации?
да, его бы уволили. Используйте вместо onCreate() с savedInstanceState
Но разве у меня не будет такой же проблемы? Обновлять только при каждом перезапуске приложения?
Каждый раз, когда создается ваш фрагмент / активность.
Не могли бы вы подробнее рассказать об этом в своем ответе?
Одно приложение может содержать одно или несколько действий. Одно действие может содержать один или несколько фрагментов. Когда вы впервые отображаете ActivityA, вызывается метод onCreate(). Если вы запустите другой ActivityB, а затем вернетесь к ActivityA, будет вызываться не onCreate(), а onResume(). Это для случая «возврата назад». Для перезапуска приложения ваши данные будут извлечены только в том случае, если будет создано соответствующее действие. Вот почему я отличаю «перезапуск приложения» от «создания активности».
Так в основном onCreate() запрашиваю данные с сервера и на onResume использую кешированные данные? В этом случае onSaveInstance не имеет значения, поскольку сохраненный пакет доступен только для onCreate.
Я правильно понял? Тогда, когда действие будет воссоздано, оно будет извлекать данные? Что произойдет, если: 1) Пользователь вернется с активности 2) Активность будет убита в фоновом режиме, верно?
Я бы использовал компоненты архитектуры Android ViewModel и LiveData, чтобы сохранять данные во время поворота экрана, предотвращая множественные обращения к серверу для изменения поворота экрана. Это предпочтительный метод, который Google предлагает своим разработчикам https://developer.android.com/topic/libraries/architecture/saving-states
Чтобы данные не устаревали, я бы либо позволил пользователю решить, когда обновлять, используя «Потяните для обновления» (как описано в другом ответе), либо добавил таймер для обновления, если фрагмент находился на переднем плане в течение длительного периода. времени, используя метод, описанный здесь: https://guides.codepath.com/android/Repeating-Periodic-Tasks
У вас есть пример кода для add a timer to update if the fragment has been in the foreground....?
Я отредактировал свой ответ, включив в него пример периодических обновлений.
Но я прав, что данные будут обновляться только при перезапуске приложения, как я описываю?