RXJava更新列表

时间:2019-03-04 22:45:22

标签: java android rx-java rx-java2 subscribe

我绝对不是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间隔?我应该重新订阅新的列表内容吗?我想重用filteredEvents。预先感谢。

2 个答案:

答案 0 :(得分:0)

是的,您应该处置掉当前的一次性用品,然后创建一个新的一次性用品。听起来可能很浪费,但是很好。

例如,对于网络请求,通常会触发网络请求,然后在返回之前触发新请求。您不再需要第一个请求,因此只需要处理它即可,实际上可以处理您想要响应的请求。

答案 1 :(得分:0)

当然,可以重新订阅新列表,但这对于视图逻辑来说太复杂了。尝试使视图尽可能简单。您的视图所需要做的只是这两件事:

  • 订阅可观察的已过滤事件列表。
  • 请求新的事件列表

可观察到的过滤后的事件列表可能仅发出一次或多次。视图不关心它发出新列表的时间。您可以使用switchMapBehaviorSubject在视图模型层中抽象所有交换逻辑,而不必在视图中具有多个订阅逻辑。

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