Rx java RxJava:在发出另一个可观察对象的数据之前,防止该可观察对象发出数据

Rx java RxJava:在发出另一个可观察对象的数据之前,防止该可观察对象发出数据,rx-java,rx-android,Rx Java,Rx Android,下面的代码块设计为先脱机。如果数据是由可观测内存发出的,则本地和远程可观测内存将永远不会触发。如果数据未保存在内存中,则本地可观察对象将尝试从房间数据库读取数据,如果所有其他操作都失败,则远程可观察对象将查询API 远程源使用改型发送查询并返回一个可流动数据,然后将其转换为可观察数据。然而,在远程observable激发之前,我有另一个observable返回查询所需的位置数据。换句话说,远程可观测值取决于可观测位置。在位置数据可用之前,如何使用RxJava防止在Concat操作符中调用远程ob

下面的代码块设计为先脱机。如果数据是由可观测内存发出的,则本地和远程可观测内存将永远不会触发。如果数据未保存在内存中,则本地可观察对象将尝试从房间数据库读取数据,如果所有其他操作都失败,则远程可观察对象将查询API

远程源使用改型发送查询并返回一个可流动数据,然后将其转换为可观察数据。然而,在远程observable激发之前,我有另一个observable返回查询所需的位置数据。换句话说,远程可观测值取决于可观测位置。在位置数据可用之前,如何使用RxJava防止在Concat操作符中调用远程observable

locationObservable = locationSource.getLocationObservable();
memory = source.getSuggestionsFromMemory();
local = source.getSuggestionsFromDisk();


remote = source.getSuggestionsFromNetwork(parameters)
                    .skipUntil(locationObservable);

locationObservable.subscribe(
                    source -> parameters = ParamManager.queryParameters(
                                    source.getLatitude() + "," + source.getLongitude()),

                    error -> Log.println(Log.ERROR, TAG, error.getMessage()
                    )
            );

Observable.concat(memory,local, remote)
            .firstElement()
            .subscribeOn(Schedulers.io())
            .toObservable()
            .observeOn(AndroidSchedulers.mainThread());
远程可观察到:

public Observable<List<Venue>> getSuggestionsFromNetwork(HashMap<String, String> parameters){
    return remoteSource.getData(parameters).doOnNext(
            data -> {
                localSource.cacheDataToDisk(data);
                memorySource.cacheDataInMemory(data);
            });
}

如果可以等到下一个位置发射,则可以执行以下操作:

locationObservable=locationSource.getLocationObservable();
memory=source.getSuggestionsFromMemory();
local=source.getSuggestionsFromDisk();
远程=可观察的位置
.map(源->参数管理器.queryParameters(源.getLatitude()+“,”
+source.getLongitude()))
.concatMap(params->source.getSuggestionsFromNetwork(params));
可观察
.concat(内存、本地、远程)
.firstElement()
...
但如果不能,则必须将最后一个位置存储在可直接使用的变量中,例如:

remote=Optional.ofNullable(getLastLocation())
.map(可观察::just)
.orElse(位置可观察)
.map(源->参数管理器.queryParameters(源.getLatitude()+“,”
+source.getLongitude()))
.concatMap(params->source.getSuggestionsFromNetwork(params));
以及其他地方:

locationObservable.subscribe(位置->setLastLocation(位置));

你问的问题真的很糟糕:)试着更好地解释你想要达到的目标OK现在这个问题的措辞如何如果我正确理解了你的问题,你想先从内存中提取数据,如果数据不在数据库中,如果在数据库中失败,也要从APIso中提取,所以你想读取本地数据,如果缓存未命中,请始终联机(aka=您不关心过时的内容),对吗?是的,这就是上面的代码所做的。如果没有任何可用数据,复合观测值将调用onComplete而不发送数据。但是,为了让远程观测值查询API,它需要设备的经度和纬度。我试图找出一种方法来防止远程观测值被直到位置数据可用为止。谢谢你的帮助。我的问题很难理解吗?这是我收到的一些反馈,上面的内容是可以理解的。我也投了赞成票
Observable<List<Venue>> getData(HashMap<String, String> params){
    return Flowable.zip(loadSearchVenues(params), loadTrendingVenues(params),
            loadRecommendedVenues(params), (search, trending, recommended) -> {

                generalVenues = search.getResponse().getSuggestions();
                trendingVenues = trending.getResponse().getSuggestions();
                recommendedVenues = recommended.getResponse().getSuggestions();

                allVenues.addAll(generalVenues);
                allVenues.addAll(trendingVenues);
                allVenues.addAll(recommendedVenues);

                return allVenues;
            }).toObservable();
}
2019-11-15 09:18:08.703 29428-29491/com.example.suggest E/MemorySource: getData() called
2019-11-15 09:18:08.703 29428-29491/com.example.suggest E/LocalSource: getData() called
2019-11-15 09:18:08.767 29428-29428/com.example.suggest E/MainViewModel: Query map was null (parameter #3)