0

按照本教程 ,我认为我会创建一个虚假的内存、磁盘、网络对象,以便在其中一个失败时查看它们的顺序。我的目标是查看一个是否失败,它会根据文章评论连接到下一个:

这种模式的关键是 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'
4

1 回答 1

4

问题是observerMemory 在订阅时调用了onNext(null)。为了让 concat 移动到下一个 Observable,observerMemory 需要完成。如果您替换subscriber.onNext(null)subscriber.onComplete()第一个发出的项目,则将来自磁盘。

于 2015-07-10T03:05:49.753 回答