下面的代码块设计为脱机优先。如果数据是由可观察的内存发出的,则本地和远程可观察的对象将永远不会触发。如果数据未保存在内存中,则本地可观察对象将尝试从会议室数据库中读取数据,如果其他所有方法均失败,则远程可观察对象将查询API。
远程源使用改型发送查询,并返回一个可流动对象,然后将其转换为可观察对象。但是,在远程可观察事件触发之前,我有另一个可观察事件返回查询所需的位置数据。换句话说,可观察的远程取决于可观察的位置。我如何使用RxJava防止在位置数据可用之前在Concat运算符中调用远程可观察对象?
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); }); }
远程源:
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)
下面的代码块设计为脱机优先。如果数据是由可观察的内存发出的,则本地和远程可观察的对象将永远不会触发。如果数据未保存在内存中,则本地可观察到的...
如果您可以等到下一个位置发射,则可以执行以下操作: