Список обновлений RXJava - PullRequest
       7

Список обновлений RXJava

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

Я абсолютно новичок в RxJava.Я пытаюсь «прослушать» изменения списка:

filteredEvents = eventViewModel.getAllByInterval(dateStart, dateEnd);

Disposable disposable = filteredEvents.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
                (events, throwable) -> {
                    if (throwable != null) {
                        throwable.printStackTrace();
                        return;
                    }

                    if (events != null) {
                        // do funny things
                    }
                }
        );

compositeDisposable.add(disposable);

Теперь: что если я хочу динамически изменить отфильтрованные события, например, изменить dateStart и интервал dateEnd?Должен ли я повторно подписаться на новый контент списка?Я хотел бы повторно использовать фильтрованные события.Заранее спасибо.

Ответы [ 2 ]

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

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

  • Подписаться на отфильтрованный список наблюдаемых событий.
  • Запросить новый список событий

Отфильтрованный список наблюдаемых событий может выдаваться только один раз или несколько раз.Представлению не важно, сколько раз он генерирует новый список.Вместо использования нескольких логик подписки в представлении вы можете абстрагировать всю логику переключения в слое модели представления, используя switchMap и BehaviorSubject.

ViewModel

public class EventViewModel {

    private BehaviorSubject<Interval> interval = BehaviorSubject.create();

    // Let view to subscribe to the filtered event list.
    public Observable<List<Event>> getFilteredEvent() {
        return interval.switchMap(interval -> getAllByInterval(interval.startDate, interval.endDate));
    }

    // Let view to request new event list. Note that this method returns nothing.
    public void updateInterval(Date dateStart, Date dateEnd) {
        interval.onNext(new Interval(dateStart, dateEnd));
    }

    // Make this private.
    private Observable<List<Event>> getAllByInterval(Date startDate, Date endDate) {
        ...
    }

    private static class Interval {
        final Date startDate;
        final Date endDate;

        Interval(Date startDate, Date endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }
    }
}

Обратите внимание, что EventViewModel имеет ровно два открытых метода.Каждый открытый метод соответствует каждому определенному выше требованию.

Просмотр

// Do this only once:
compositeDisposable.add(eventViewModel.getFilteredEvent().subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
            (events, throwable) -> {
                if (throwable != null) {
                    throwable.printStackTrace();
                    return;
                }

                if (events != null) {
                    // do funny things
                }
            }
    ));

// Do this as many times as you like. New list will be emitted
// by EventViewModel.getFilteredEvents.
eventViewModel.updateInterval(dateStart, dateEnd);

Если вы используете Flowable вместо Observable, вы можете заменить BehaviorSubject с BehaviorProcessor.

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

Да, вы должны просто утилизировать свой текущий одноразовый и создать новый.Это может звучать расточительно, но это нормально.

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

...