Получать данные с помощью репозитория после изменения ориентации - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть вопрос, связанный с изменением ориентации. В моем приложении я использую MVP + Retrofit + RxKotlin и Repository pattern. В приложении открытые данные загружаются из API через репозиторий - все хорошо. После того, как я повернул устройство, мне интересно, как мне получить данные, не спрашивая API снова. Должен ли я сохранять данные в DB после первой загрузки или я должен сделать что-то другое?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вам не нужно совершать вызовы API во фрагментах ViewPager, и вам также не следует делать это в своей деятельности. Вместо этого вы можете добавить фрагмент в основной деятельности. Этот фрагмент будет вашим родительским фрагментом. В родительском фрагменте onCreate() находится место вызова API. Затем вы создаете ViewPager с отдельными дочерними фрагментами внутри родительского фрагмента. Убедитесь, что при создании адаптера ViewPager вы передаете экземпляр дочернего FragmentManager следующим образом:

public class ParentFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        API.getData(); //Make API call; has to be done on a separate thread using an AsyncTask or an IntentService. When Data is successfully retrieved, save it to a field in this Fragment.
        //Create ViewPager adapter here like this:
        viewPagerAdapter = new MainVPAdapter(getChildFragmentManager()); //<- important
    }
}
1 голос
/ 12 февраля 2020

Это то, как я работаю с моим приложением, где я также использую шаблон ViewModel + Repository:

  • Сначала убедитесь, что у вашего объекта Repository есть область приложения, чтобы он также выдерживал уничтожение фрагментов. и деятельность.
  • Поскольку ваша ViewModel выживет при поворотах экрана, сохраняйте кеш выбранных данных в памяти в вашей ViewModel. Например: если вы заставите ваш пользовательский интерфейс наблюдать LiveData в вашей ViewModel, и вы установите значение в LiveData, когда репозиторий вернется, LiveData сохранит последнее переданное значение, поэтому, когда ваш пользовательский интерфейс снова подпишется, вы сразу получите данные .
  • И, так как ваш фрагмент будет воссоздан, вы будете вызывать снова fetch, но в вашей ViewModel вы можете сохранить и проверить, сделали ли вы сетевой вызов с теми же параметрами и URL, и проигнорировать его. , (Примечание: не устанавливайте фильтр, если saveInstanceState не является нулевым, чтобы избежать повторной выборки, это не всегда так).

Это идея, которую вы можете адаптировать по-своему.

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

...