Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用RxJava实现存储库模式_Java_Android_Rx Java - Fatal编程技术网

用RxJava实现存储库模式

用RxJava实现存储库模式,java,android,rx-java,Java,Android,Rx Java,我正试图找到一种更好的方法来实现Android中RxJava中的存储库模式 以下是我到目前为止所做的:(从中获取一些代码) 公共订阅getData(观察者,布尔刷新){ Subscription=null; 数据缓存=getCachedData(); 如果(缓存!=null){ observer.onNext(缓存); 如果(刷新){ sub=requestNetwork().subscribe(观察者); }否则{ observer.onCompleted(); } }否则{ sub=requ

我正试图找到一种更好的方法来实现Android中RxJava中的存储库模式

以下是我到目前为止所做的:(从中获取一些代码)

公共订阅getData(观察者,布尔刷新){
Subscription=null;
数据缓存=getCachedData();
如果(缓存!=null){
observer.onNext(缓存);
如果(刷新){
sub=requestNetwork().subscribe(观察者);
}否则{
observer.onCompleted();
}
}否则{
sub=requestNetwork().subscribe(观察者);
}
返回子节点;
}
基本上,它会检查是否存储了缓存数据,如果没有,它会发出网络请求。它还具有
refresh
boolean参数强制它始终发出网络请求

问题是(或不是),此函数的调用方需要调用它,它将接收
订阅
,而不是
可观察
,我无法再链接它


有没有一种方法可以使函数返回
可见,但仍然具有存储库模式?

感谢Dan Lew向我指出的akarnokd

我的最终代码:

public Observable<Data> getData(boolean refresh) {
    Observable<Data> obs = Observable.concat(getCache(), requestNetwork());
    if(!refresh) {
        obs = obs.first(data -> data != null);
    }
    return obs;
}
公共可观察的getData(布尔刷新){
Observable obs=Observable.concat(getCache(),requestNetwork());
如果(!刷新){
obs=obs.first(数据->数据!=null);
}
返回obs;
}

See啊,我曾经打开过那篇文章,但没有使用它,因为它使用了
first
,使得订阅者只能从匹配谓词的第一个源获取。我忘记了我可以通过使用
refresh
参数选择不调用
first
操作符。谢谢但是当缓存中有一个项目并且刷新为真时,这将发出两个项目…@TassosBassoukos我想这就是我想要的。视图将接收两次项目。首先缓存,然后再次渲染网络中的新缓存。
public Observable<Data> getData(boolean refresh) {
    Observable<Data> obs = Observable.concat(getCache(), requestNetwork());
    if(!refresh) {
        obs = obs.first(data -> data != null);
    }
    return obs;
}