RxJava и смена ориентации экрана

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

RxJava и смена ориентации экрана

Сообщение Sk_games » 05 авг 2015, 23:38

Всем хорошего вечера. После освоения одной темы, касательно RxJava осталось несколько вопросов.

Первое, на что я так и не смог найти решение, это поведения Observer при смене ориентации экрана. Можно ли при пересоздании активити, и восстановления данных текущего фрагмента, вернуть данные, которые обрабатывались Слушателем, до этого?

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

Заранее спасибо, если будет кому помочь в этой теме.

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 06 авг 2015, 19:28

Свой ответ на смену ориентации решился, при чем ответ был куда прощу, чем ожидалось. В своем фрагменте\активити, я всего навсего запоминаю состояние, и дальше по состояниям использую методы:

Код: Выделить всё

  @Override
  protected void onResume() {
    super.onResume();
    mSubscription = mObservable.subscribe(mSubscriber);
  }

  @Override
  protected void onPause() {
    super.onPause();
    mSubscription.unsubscribe();
  }

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 06 авг 2015, 19:32

Теперь озадачился еще одним интересным вопросом. Если реактивное программирование использует шаблон проектирования публицист - подписчик. Может ли он заменить использование OttoBus и EventBus? Поискав в интернете, уже есть не один пример, где частично, или полностью отказываются от использования автобусов, в преимущество реактивного программирования. Есть ли форумчане с опытом в этой сфере, и могут ли они поделится своими мыслями в этой сфере.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 06 авг 2015, 19:38

Вообще-то, данный кусок кода совершенно не делает того, что ты хотел вначале
Можно ли при пересоздании активити, и восстановления данных текущего фрагмента, вернуть данные, которые обрабатывались Слушателем, до этого?
Это просто в коде привязка идет состояния активити и observable, чтобы не было утечек, не сохранялась ссылка в observable на активити.
Таким образом, при пересоздании в простейшем случае ты ЗАНОВО подписываешься на тот же самый запрос и он будет осуществлен заново. Если это 3-5 секундный запрос - то это ОК. А если допустим, пользователь ввел данные и нажал на кнопку "зарегистрироваться", то тут надо действовать по-другому.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 06 авг 2015, 19:39

Sk_games писал(а):Теперь озадачился еще одним интересным вопросом. Если реактивное программирование использует шаблон проектирования публицист - подписчик. Может ли он заменить использование OttoBus и EventBus? Поискав в интернете, уже есть не один пример, где частично, или полностью отказываются от использования автобусов, в преимущество реактивного программирования. Есть ли форумчане с опытом в этой сфере, и могут ли они поделится своими мыслями в этой сфере.
можно.
Своих мыслей у меня пока мало, могу лишь поделиться ссылками как это реализуется
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 06 авг 2015, 19:46

Это просто в коде привязка идет состояния активити и observable, чтобы не было утечек, не сохранялась ссылка в observable на активити.
Таким образом, при пересоздании в простейшем случае ты ЗАНОВО подписываешься на тот же самый запрос и он будет осуществлен заново. Если это 3-5 секундный запрос - то это ОК. А если допустим, пользователь ввел данные и нажал на кнопку "зарегистрироваться", то тут надо действовать по-другому.
Можно еще раз. Т.е. когда я подписываюсь на изменения, запрос не возвращает данные, обработанные в предыдущий раз? От делает запрос еще раз?

Я просто ищу решения, допустим пользователь нажал зарегистрироваться в одном состоянии, мы слушателем создали новый поток и отправили туда данные на обработку. Все ок. Потом при повороте экрана, эти данные обнулились и обработка данных началась заново? А мне нужно вернуть данные из первой обработки, заместь того, что бы посылать их заново... Я все правильно понял, или уже запутался.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 06 авг 2015, 20:23

1. Как только ты подписываешься на обычный observable, то он начинает свои действия. А ты это как раз делаешь в onREsume
2. Для того, чтобы "поймать" результат, который был отправлен до перворота активити, нужно кешировать и вообще использовать например Subject-ы, либо retained фрагменты, короче там все не просто.
Попробуй как тут написано, но это для коротких запросов.
http://stablekernel.com/blog/replace-as ... -patterns/
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 06 авг 2015, 23:53

Foenix

Что то мне подсказывает, что мы подходим по вопросу конкретного проектирования. Может правильным решением было бы создание главного класса, пула внутренних потоков, которым мы бы отдавали данные на обработку и получали бы с него, не беспокоясь о перевороте экрана. Так сказать выполненный RxBus... На мой взгляд это было бы верным решением, даже для мелких запросов. К сожалению, как это реализовать, я пока не знаю...

Еще одно замечание, по поводу сообщения выше. Был один пример взятый тут https://github.com/alphamu/RxAndroidDemo, там в одном из примером лайфцикла Observal, есть интересный момент. Там в потоке, с задержкой 1 секунду билдят стринг. Промежуточные результаты не выводят сразу же, а просто оставляют в Observal. Там вот там, после половины задания, строится строка "Hello", текущее состояние потока кешируется, и после поворота экрана, стринг продолжает билдиться на этом этапе и достраивает строку. Разве это нельзя считать тем, о чем зашла речь?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 07 авг 2015, 07:05

Промежуточные результаты не выводят сразу же, а просто оставляют в Observal.
с чего ты это взял?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 07 авг 2015, 15:21

Foenix

Да, я ошибся, на счет вчерашнего примера. Обработка задания начинается заново, просто билдят стринг продолжают с того места. на котором произошел поворот экрана. Из за этого запутался...

Кстати есть решение, о котором я вначале заговорил - http://tttzof351.blogspot.com/2014/11/a ... ntbus.html. Единственная загвоздка, что автор не вникал в суть реактивного, где можно было бы полностью отказаться от автобуса.

Еще один полезный ресурс, о чем я говорил, вот здесь http://blog.danlew.net/2014/10/08/grokk ... va-part-4/ там ниже в пункте LifeCycle. Правда разбираться еще не пробовал. Как только что то выйдет, обязательно напишу. Было бы классно разобраться в использовании на весь проект такого шаблона, взамен привычным автобусам.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 07 авг 2015, 17:26

да все эти ссылки я знаю) Там толком мало полезного.
Вот посмотри
http://nerds.weddingpartyapp.com/tech/2 ... ava-rxbus/
не ограничивайся русским интернетом, там очень мало информации..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 07 авг 2015, 19:13

Foenix

Да никто русским контентом не ограничивается, наоборот :) Не хватало мне... Просто по запросу "RxJava as event bus" на третий странице была вот такая статья...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 07 авг 2015, 20:19

есть еще ютуб, там вообще больше всего инфы
Я если честно тоже не особо понимаю, почему этот вопрос такой проблемный ( с переворотами). Ведь эта такая нужная штука, котороая в каждом проекте юзается (почти), и я думала что этот вопрос должен быть давно отработан, так сказать. Ан нет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Re: RxJava и смена ориентации экрана

Сообщение Sk_games » 11 авг 2015, 14:50

Foenix

Кто говорит, что вопрос проблемный?! Разве не интересно, открыть для себя мощность реактивной библиотеки. Как будто сейчас проблема вставить обработку в отдельный тред сервиса и биндить результат независимо от ориентации экрана! Тут суть вопроса, не о перевороте экрана, а о поведении в случае с RxJava...

1) Пример реализации реактивного автобуса, на самом деле уже была решена, в наработанных примерах. Если нужно, оставьте коммент, скину проект. Все работает, как и предполагалось отлично...

2) По поводу кеширования и возобновления результатов. После нескольких проектов, и не одной статьей с описанием, (Пример - Пункт Lifecycle) http://blog.danlew.net/2014/10/08/grokk ... va-part-4/ Восстановить сессию работы Observables, можно с функциями cache() (or replay()) . Вручную добавив данные на загрузку и перевороте экрана, следующая загрузка начиналась исходя из результатов предыдущей обработки. Все это подтверждено на практике. Если надо будут эти примеры. Пишите в эту тему.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: RxJava и смена ориентации экрана

Сообщение Foenix » 11 авг 2015, 16:33

вообще-то это проблемный вопрос по-определению
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить