Как справиться с ротацией с помощью Retrofit и RxJava/RxAndroid в действии?

Я прочитал здесь что мы можем использовать некоторый глобальный кеш для обработки ротации.

Вы можете предотвратить это, используя операторы cache или replay Observable, убедившись, что Observable каким-то образом переживает жизненный цикл Activity (например, сохраняя его в глобальном кеше, во фрагменте и т. д.).

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

РЕДАКТИРОВАТЬ:

На данный момент я нашел много способов, но остановился на реализации RxBus. Хороший пример использования RxBus вы можете найти здесь.


person Denshov    schedule 27.08.2015    source источник


Ответы (2)


Я сделал демонстрационное приложение (https://github.com/pmellaaho/RxApp) для экспериментов. как решать различные ситуации в Android-приложении. Короче говоря, я использую одноэлементную модель из Activity, чтобы получить ответ от сети. Это позволяет кэшировать ответы, получать доступ к данным из нескольких компонентов пользовательского интерфейса, подписываться на ожидающие запросы, а также предоставлять фиктивные данные для автоматических тестов пользовательского интерфейса.

person pmellaaho    schedule 28.08.2015
comment
Спасибо за демонстрационное приложение! Но я думаю, что мы должны использовать библиотеку RxLifecycle, чтобы обрабатывать ротацию, когда мы делаем запрос. Посмотрите изменения и стабильную версию RxAndroid github.com/ReactiveX/RxAndroid/blob/< /а> - person Denshov; 31.08.2015
comment
У меня нет личного опыта работы с RxLifecycle, но я думаю, что он может позаботиться об автоматической отмене подписки на основе событий жизненного цикла. Вам все еще нужно позаботиться о подписке на ожидающие запросы/получении кэшированных данных самостоятельно. Пожалуйста, поправьте, если я ошибаюсь - person pmellaaho; 01.09.2015
comment
Я думаю, вы правы, но я еще не реализовал RxLifecycle, поэтому не могу вас сейчас поправить. Я надеюсь, что кто-то, кто уже использовал RxLifecycle и RxBinding, может нас поправить. - person Denshov; 01.09.2015
comment
Мне жаль, что я ошибся насчет RxLifecycle, он может только позаботиться об автоматической отмене подписки, чтобы предотвратить утечку памяти, а не обрабатывать ротацию. Это было мое недоразумение. Еще раз спасибо за ваш пример! - person Denshov; 04.09.2015
comment
@pmellaaho, как вы справляетесь с дополнительной загрузкой (разбивка на страницы) - person Raghunandan; 09.11.2015
comment
По сути, вы просто помещаете данные в статическое хранилище. - person Malcolm; 20.07.2016
comment
При изменении ориентации вы хотите сохранить запрос и доставить его в новое действие. При фактическом уничтожении активности вы хотите убить запрос и отказаться от результатов. У кого-нибудь есть решение? - person Greg Ennis; 23.11.2016
comment
@GregEnnis Есть способ отправить запросы NW в Presenter, а затем использовать Loader, чтобы сохранить Presenter во время изменения конфигурации. Подробнее об этом можно прочитать [здесь] (medium.com/@czyrux/) - person pmellaaho; 30.11.2016

Недавно я использовал Loader в сочетании с ConnectableObservable для лучшей обработки ротации во время потока RxJava2. Я даже создал Medium Post, подробно объясняющий мой подход.

По сути, вам нужно поместить наблюдаемое (ConnectableObservable) в Loader с Transformer, а затем повторно подписаться на него, когда активность/фрагмент возобновить работу после уничтожения.

person Phil    schedule 17.12.2017