Страница 1 из 1
RxJava и смена ориентации экрана
Добавлено: 05 авг 2015, 23:38
Sk_games
Всем хорошего вечера. После освоения одной темы, касательно RxJava осталось несколько вопросов.
Первое, на что я так и не смог найти решение, это поведения Observer при смене ориентации экрана. Можно ли при пересоздании активити, и восстановления данных текущего фрагмента, вернуть данные, которые обрабатывались Слушателем, до этого?
И еще один интересный момент, это обновление прогресса. Нашел размытый для себя ответ, но до конца его не понял, и в документации схожего не нашел. Я теоретически представляю, что прогресс нужно обновлять в onNext, каждой итерации, но как это реализовывается, пока не знаю...
Заранее спасибо, если будет кому помочь в этой теме.
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 19:28
Sk_games
Свой ответ на смену ориентации решился, при чем ответ был куда прощу, чем ожидалось. В своем фрагменте\активити, я всего навсего запоминаю состояние, и дальше по состояниям использую методы:
Код: Выделить всё
@Override
protected void onResume() {
super.onResume();
mSubscription = mObservable.subscribe(mSubscriber);
}
@Override
protected void onPause() {
super.onPause();
mSubscription.unsubscribe();
}
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 19:32
Sk_games
Теперь озадачился еще одним интересным вопросом. Если реактивное программирование использует шаблон проектирования публицист - подписчик. Может ли он заменить использование OttoBus и EventBus? Поискав в интернете, уже есть не один пример, где частично, или полностью отказываются от использования автобусов, в преимущество реактивного программирования. Есть ли форумчане с опытом в этой сфере, и могут ли они поделится своими мыслями в этой сфере.
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 19:38
Foenix
Вообще-то, данный кусок кода совершенно не делает того, что ты хотел вначале
Можно ли при пересоздании активити, и восстановления данных текущего фрагмента, вернуть данные, которые обрабатывались Слушателем, до этого?
Это просто в коде привязка идет состояния активити и observable, чтобы не было утечек, не сохранялась ссылка в observable на активити.
Таким образом, при пересоздании в простейшем случае ты ЗАНОВО подписываешься на тот же самый запрос и он будет осуществлен заново. Если это 3-5 секундный запрос - то это ОК. А если допустим, пользователь ввел данные и нажал на кнопку "зарегистрироваться", то тут надо действовать по-другому.
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 19:39
Foenix
Sk_games писал(а):Теперь озадачился еще одним интересным вопросом. Если реактивное программирование использует шаблон проектирования публицист - подписчик. Может ли он заменить использование OttoBus и EventBus? Поискав в интернете, уже есть не один пример, где частично, или полностью отказываются от использования автобусов, в преимущество реактивного программирования. Есть ли форумчане с опытом в этой сфере, и могут ли они поделится своими мыслями в этой сфере.
можно.
Своих мыслей у меня пока мало, могу лишь поделиться ссылками как это реализуется
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 19:46
Sk_games
Это просто в коде привязка идет состояния активити и observable, чтобы не было утечек, не сохранялась ссылка в observable на активити.
Таким образом, при пересоздании в простейшем случае ты ЗАНОВО подписываешься на тот же самый запрос и он будет осуществлен заново. Если это 3-5 секундный запрос - то это ОК. А если допустим, пользователь ввел данные и нажал на кнопку "зарегистрироваться", то тут надо действовать по-другому.
Можно еще раз. Т.е. когда я подписываюсь на изменения, запрос не возвращает данные, обработанные в предыдущий раз? От делает запрос еще раз?
Я просто ищу решения, допустим пользователь нажал зарегистрироваться в одном состоянии, мы слушателем создали новый поток и отправили туда данные на обработку. Все ок. Потом при повороте экрана, эти данные обнулились и обработка данных началась заново? А мне нужно вернуть данные из первой обработки, заместь того, что бы посылать их заново... Я все правильно понял, или уже запутался.
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 20:23
Foenix
1. Как только ты подписываешься на обычный observable, то он начинает свои действия. А ты это как раз делаешь в onREsume
2. Для того, чтобы "поймать" результат, который был отправлен до перворота активити, нужно кешировать и вообще использовать например Subject-ы, либо retained фрагменты, короче там все не просто.
Попробуй как тут написано, но это для коротких запросов.
http://stablekernel.com/blog/replace-as ... -patterns/
Re: RxJava и смена ориентации экрана
Добавлено: 06 авг 2015, 23:53
Sk_games
Foenix
Что то мне подсказывает, что мы подходим по вопросу конкретного проектирования. Может правильным решением было бы создание главного класса, пула внутренних потоков, которым мы бы отдавали данные на обработку и получали бы с него, не беспокоясь о перевороте экрана. Так сказать выполненный RxBus... На мой взгляд это было бы верным решением, даже для мелких запросов. К сожалению, как это реализовать, я пока не знаю...
Еще одно замечание, по поводу сообщения выше. Был один пример взятый тут
https://github.com/alphamu/RxAndroidDemo, там в одном из примером лайфцикла Observal, есть интересный момент. Там в потоке, с задержкой 1 секунду билдят стринг. Промежуточные результаты не выводят сразу же, а просто оставляют в Observal. Там вот там, после половины задания, строится строка "Hello", текущее состояние потока кешируется, и после поворота экрана, стринг продолжает билдиться на этом этапе и достраивает строку. Разве это нельзя считать тем, о чем зашла речь?
Re: RxJava и смена ориентации экрана
Добавлено: 07 авг 2015, 07:05
Foenix
Промежуточные результаты не выводят сразу же, а просто оставляют в Observal.
с чего ты это взял?
Re: RxJava и смена ориентации экрана
Добавлено: 07 авг 2015, 15:21
Sk_games
Foenix
Да, я ошибся, на счет вчерашнего примера. Обработка задания начинается заново, просто билдят стринг продолжают с того места. на котором произошел поворот экрана. Из за этого запутался...
Кстати есть решение, о котором я вначале заговорил -
http://tttzof351.blogspot.com/2014/11/a ... ntbus.html. Единственная загвоздка, что автор не вникал в суть реактивного, где можно было бы полностью отказаться от автобуса.
Еще один полезный ресурс, о чем я говорил, вот здесь
http://blog.danlew.net/2014/10/08/grokk ... va-part-4/ там ниже в пункте
LifeCycle. Правда разбираться еще не пробовал. Как только что то выйдет, обязательно напишу. Было бы классно разобраться в использовании на весь проект такого шаблона, взамен привычным автобусам.
Re: RxJava и смена ориентации экрана
Добавлено: 07 авг 2015, 17:26
Foenix
да все эти ссылки я знаю) Там толком мало полезного.
Вот посмотри
http://nerds.weddingpartyapp.com/tech/2 ... ava-rxbus/
не ограничивайся русским интернетом, там очень мало информации..
Re: RxJava и смена ориентации экрана
Добавлено: 07 авг 2015, 19:13
Sk_games
Foenix
Да никто русским контентом не ограничивается, наоборот

Не хватало мне... Просто по запросу "RxJava as event bus" на третий странице была вот такая статья...
Re: RxJava и смена ориентации экрана
Добавлено: 07 авг 2015, 20:19
Foenix
есть еще ютуб, там вообще больше всего инфы
Я если честно тоже не особо понимаю, почему этот вопрос такой проблемный ( с переворотами). Ведь эта такая нужная штука, котороая в каждом проекте юзается (почти), и я думала что этот вопрос должен быть давно отработан, так сказать. Ан нет.
Re: RxJava и смена ориентации экрана
Добавлено: 11 авг 2015, 14:50
Sk_games
Foenix
Кто говорит, что вопрос проблемный?! Разве не интересно, открыть для себя мощность реактивной библиотеки. Как будто сейчас проблема вставить обработку в отдельный тред сервиса и биндить результат независимо от ориентации экрана! Тут суть вопроса, не о перевороте экрана, а о поведении в случае с RxJava...
1) Пример реализации реактивного автобуса, на самом деле уже была решена, в наработанных примерах. Если нужно, оставьте коммент, скину проект. Все работает, как и предполагалось отлично...
2) По поводу кеширования и возобновления результатов. После нескольких проектов, и не одной статьей с описанием, (Пример - Пункт Lifecycle)
http://blog.danlew.net/2014/10/08/grokk ... va-part-4/ Восстановить сессию работы
Observables, можно с функциями
cache() (or replay()) . Вручную добавив данные на загрузку и перевороте экрана, следующая загрузка начиналась исходя из результатов предыдущей обработки. Все это подтверждено на практике. Если надо будут эти примеры. Пишите в эту тему.
Re: RxJava и смена ориентации экрана
Добавлено: 11 авг 2015, 16:33
Foenix
вообще-то это проблемный вопрос по-определению