我很难理解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的理解在这里是完全错误的?
答案 0 :(得分:0)
你遗漏了一件事:Subject
既是Observable
又是Observer
。
Subject
的方法(例如Observable
,Observable
)时,filter
将像map
一样行动,它会返回一个新的Observable
而不更改原始版本。 Subject
的方法时,Observer
将充当Observer
(例如onNext
,onCompleted
,onError
),你会看到这些方法的副作用。