RxJava Android返回网络前缓存

RxJava Android返回网络前缓存,android,caching,rx-java,Android,Caching,Rx Java,我试图实现一个快速返回的缓存,然后一个网络请求在完成后更新UI 如果手机处于信号状态,使用Rx startWith可以正常工作,但是如果我将手机置于飞机模式,改装web调用会很快失败,因此从startWith返回的缓存值永远不会返回,因为onError会立即终止可观察到的。我还需要知道observable是否抛出onError以向用户显示。我的缓存几乎是即时的,因此我希望在尝试任何网络调用之前返回缓存。有没有一种方法可以干净利落地做到这一点?还是更好的方法 public Observable&l

我试图实现一个快速返回的缓存,然后一个网络请求在完成后更新UI

如果手机处于信号状态,使用Rx startWith可以正常工作,但是如果我将手机置于飞机模式,改装web调用会很快失败,因此从startWith返回的缓存值永远不会返回,因为onError会立即终止可观察到的。我还需要知道observable是否抛出onError以向用户显示。我的缓存几乎是即时的,因此我希望在尝试任何网络调用之前返回缓存。有没有一种方法可以干净利落地做到这一点?还是更好的方法

public Observable<String> getMyString(String key){
        WebRequestDbEntity myCachedString = mCache.getWebRequest(key);
        String cachedString = myCachedString.getValue();

        return retrofitWebDataStore().getMyString(key)
                .startWith(Observable.just(cachedString))
                .map(networkString -> {
                    mCache.saveRequest(key, networkString);
                    return networkString;
                });
    }

您可能需要考虑使用Cutt(),缓存作为第一个可观察的方式,这样可以确保缓存结果(如果有的话)在启动网络可观察之前返回。大概是这样的:

Observable<String> cacheObservable = Observable.fromCallable(() -> {
    WebRequestDbEntity myCachedString = mCache.getWebRequest(key);
    return myCachedString.getValue();
});
Observable<String> serverObservable =
        retrofitWebDataStore().getMyString(key)
                .doOnNext(networkString -> mCache.saveRequest(key, networkString));

return Observable.concat(cacheObservable, serverObservable);
Observable cacheObservable=Observable.fromCallable(()->{
WebRequestDbEntity myCachedString=mCache.getWebRequest(key);
返回myCachedString.getValue();
});
可观察的,可观察的=
更新WebDataStore().getMyString(键)
.doOnNext(networkString->mCache.saveRequest(key,networkString));
返回Observable.concat(cacheObservable,serverObservable);

这样,您就可以确保返回第一个缓存对象(在您的示例中,您没有处理无缓存情况,但是可以通过签入gfor no cache result和筛选很容易地解决这个问题,因此缓存可观察到返回结果或完全不包含任何内容),并且您将首先在表示逻辑中处理它。之后,网络请求将启动,如果您得到结果,您将把它保存到
doOnNext()
中的缓存中(在您的示例中,您也是使用缓存的结果进行的,不确定这是否是您想要的),唯一的错误可能来自网络请求,但不会使缓存不返回值,因为它发生在缓存获取之后。

在观察可观察到的。。。使用observeOn(AndroidSchedulers.mainThread,true)。其中,真实值为延迟错误。这允许缓存observable在网络observable抛出错误之前返回

getMyString(key)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread(), true)
                    .subscribe(this::onSuccess, this::onError);

谢谢你的回答,尤里兹。我发现康卡特也有同样的问题。。。在第二个可观察对象有机会启动之前,第一个可观察对象没有发出这些值,这可能是RxJava中的错误?我已经找到了答案。。。当观察可观察到的。。。使用observeOn(AndroidSchedulers.mainThread,true)。其中,真实值为延迟错误。
getMyString(key)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread(), true)
                    .subscribe(this::onSuccess, this::onError);