Перепишитесь на Observable в Android Фрагмент - PullRequest
0 голосов
/ 05 марта 2020

Новичок в RxJava / Android и интересно, где разместить подписчика во Фрагменте?

Что-то вроде следующего кода теперь помещено в onCreate фрагмента. onNext будет вызываться несколько раз при получении новых данных, которые не нужны. Это перезагрузит данные, полученные несколько раз, это должно быть сделано только один раз. Какой правильный способ справиться с этим?

Если я откажусь от подписки, где и как отписаться, чтобы прослушать новые данные при возврате (после перехода в действие) к этому фрагменту снова?

   Some.replaySubject
                    .subscribeOn(Schedulers.newThread())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Status>() {
                        @Override
                        public void onNext(Status status) {

                            switch (status) {
                                case NotLoaded:
                                   ...
                                    break;
                                case Loading:
                                    showSpinner();
                                    break;
                                case Background_Loading:
                                  ...
                                    break;
                                case Complete:
                                   reloadData();

1 Ответ

0 голосов
/ 05 марта 2020

Использование дубля 1. Наблюдаемое завершается после первого выброса.

http://reactivex.io/documentation/operators/take.html

Вы можете испускать только первые n элементов, испущенных наблюдаемым а затем завершите, игнорируя оставшуюся часть, изменив Observable с помощью оператора Take.

Some.replaySubject
    .take(1)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<Status>() {
        @Override
        public void onNext(Status status) {

            switch (status) {
                case NotLoaded:
                    ...
                    break;
                case Loading:
                    showSpinner();
                    break;
                case Background_Loading:
                    ...
                    break;
                case Complete:
                    reloadData();

Для повторной подписки включите эту цепочку rx в onStart? onResume? Где-то обратные вызовы жизненного цикла перезапустят его. Утилизируйте его на Дестрой.

...