了解RxJava运算符的工作原理

时间:2016-04-05 07:10:43

标签: java rx-java

我很难理解RxJava中的某些组件及其工作原理。 我的这些代码基于how to implement Repository Pattern with RxJava

private Observable<String> getData(boolean refresh) {
    Observable<String> a = Observable.concat(getCache(), getNetwork());

    if(!refresh) {
        a.first(s -> s.equals("cache"));
    }

    return a;
}


private Observable<String> getCache() {
    return Observable.just("cache");
}


private Observable<String> getNetwork() {
    return Observable.just("network");
}

我打电话给这个函数:

getData(false).subscribe(s -> Log.d("Not Refresh", s));
getData(true).subscribe(s -> Log.d("Refresh", s));
// Both of them print this:
// cache
// network

哪个不对,因为我在first()时应用了refresh = true功能。 然后,我认为first()运算符可能没有反映到原始对象;所以我重新分配它。

if(!refresh) {
    a = a.first(s -> s.equals("cache"));
}

然后它就像我想要的那样工作并打印这些行:

// Not Refresh cache
// Refresh cache 
// Refresh network

我继续学习另一件事,RxBus。我的代码:

private ReplaySubject<Object> subject = ReplaySubject.create();

private <T> Observable<T> subscribe(Class<T> desiredClass) {
    return subject
            .filter(item -> item.getClass().equals(desiredClass)) // Note this line
            .map(item -> (T) item);
}

private <T> void post(T item) {
    subject.onNext(item); // This one too
}

用这些函数调用函数:

 sub(String.class).subscribe(s -> Log.d("Sub String", s));
 sub(Integer.class).subscribe(s -> Log.d("Sub Integer", s + ""));

 post("String A");
 post(5);

 // Result:
 // Sub String A
 // Sub Integer 5

当我致电sub()时,它会应用filter()map()运算符并将其返回。 根据我的理解,原始主题未被更改,那么为什么调用subject.onNext()也会调用sub()中返回的修改后的对象?

与主题有什么关系吗?或者我对RxJava的理解在这里是完全错误的?

1 个答案:

答案 0 :(得分:0)

你遗漏了一件事:Subject既是Observable又是Observer

    当你调用Subject的方法(例如ObservableObservable)时,
  • filter将像map一样行动,它会返回一个新的Observable而不更改原始版本。
  • 但是,当您调用Subject的方法时,Observer将充当Observer(例如onNextonCompletedonError ),你会看到这些方法的副作用。