按照本教程 ,我认为我会创建一个虚假的内存、磁盘、网络对象,以便在其中一个失败时查看它们的顺序。我的目标是查看一个是否失败,它会根据文章评论连接到下一个:
这种模式的关键是 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());
}
});
但是,在运行此测试时,我期望它打印磁盘 observable (stream) 。所以输出应该是 38 Oriole 等,因为第一个 observable 返回 null 并且如果我认为失败,concat 应该得到下一个流。我的意思是根据文章,如果一个流失败,例如内存流,那么 concat 应该转到下一个流,即磁盘。但对我来说,它没有这样的事情。发射在第一个 null 错误处停止。我究竟做错了什么。在我继续使用反应式编程制作真正的缓存系统之前,我正在做这个假测试以确保这种方式有效。
顺便说一下,这里是 rxjava 依赖 im 使用:
compile 'com.netflix.rxjava:rxjava-android:0.20.7'