Повторная подписка на новый список, безусловно, вариант, но это звучит слишком сложно для логики представления.Постарайтесь сделать вид максимально простым.Все, что нужно вашему представлению, это только эти две вещи:
- Подписаться на отфильтрованный список наблюдаемых событий.
- Запросить новый список событий
Отфильтрованный список наблюдаемых событий может выдаваться только один раз или несколько раз.Представлению не важно, сколько раз он генерирует новый список.Вместо использования нескольких логик подписки в представлении вы можете абстрагировать всю логику переключения в слое модели представления, используя 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
.