关注tutorial 我想我会创建一个假的内存,磁盘,网络对象,如果一个失败,就会看到订单。我的目标是根据文章评论看看是否有人失败了concat移动到下一个:
然后我创建了以下测试:这种模式的关键是concat()只在需要时订阅每个子Observable。如果数据被缓存,则没有不必要的查询较慢的源,因为first()将提前停止序列。换句话说,如果内存返回结果,那么我们就不会打扰去磁盘或网络。相反,如果内存和磁盘都没有数据,它就会发出新的网络请求。
Data disk=new Data();
disk.setAddress("38 Oriole");
disk.setPostalCode("mc72l9");
disk.setDate("feb 12");
Data network=new Data();
network.setAddress("39 skyway");
network.setPostalCode("mt82l9");
network.setDate("feb 13");
Observable observerMemory = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(final Subscriber subscriber) {
subscriber.onNext(null);
}}
);
Observable<Data> observerDisk = Observable.from(disk);
Observable<Data> observerNetwork = Observable.from(network);
Observable.concat(observerMemory, observerDisk, observerNetwork).first().subscribe(new Subscriber<Data>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
System.out.println("****" + e);
}
@Override
public void onNext(Data data) {
System.out.println(data.toString());
}
});
但是,在运行此测试时,我希望它能够打印磁盘可观察(流)。所以输出应该是38 Oriole等,因为第一个observable返回null,如果一个我想的失败,concat应该得到下一个流。我的意思是根据文章,如果一个流失败,如内存流,那么concat应该转到下一个磁盘流。但对我来说,它没有这样的事情。发射在第一个零错误处停止。我究竟做错了什么。我正在做这个假测试,以确保这种方式有效,然后我继续使用反应式编程创建一个真正的缓存系统。
顺便说一句,这里使用的是rxjava依赖:
compile 'com.netflix.rxjava:rxjava-android:0.20.7'
答案 0 :(得分:4)
问题是observerMemory在订阅时调用onNext(null)。为了让concat继续前进到下一个Observable,需要完成observerMemory。如果将subscriber.onNext(null)
替换为subscriber.onComplete()
,则第一个发出的项目将来自磁盘。