有这样的代码。
在这里,我们获取手机的位置并在地图上显示给用户。
Single<Task<Location>> taskSingle = Single.create(singleSubscriber -> mMapHandler.getCurrentLocation(activity));
Disposable getCurrentLocationDisposable = taskSingle
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(locationTask -> locationTask.addOnSuccessListener(this::updateMap));
而这里我们必须获取用户所在城市的名称,并通过该字符串通过城市名称查询天气。
Disposable getWeatherDisposable = mModel.getWeatherData(city)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::updateUi,
this::handleError);
我不知道该怎么做。如何从第一个 Observable 获取数据,并根据这些数据启动第二个 Observable。
我试过这样,但有一个问题
Disposable disposable = taskSingle
.flatMap(new Function<Task<Location>, SingleSource<? extends WeatherData>>() {
@Override
public SingleSource<? extends WeatherData> apply(Task<Location> locationTask) throws Exception {
locationTask.addOnSuccessListener(location -> {
updateMap(location);
String single = getCurrentLocationCity(activity, location);
});
return //вот тут я не знаю как вернуть значение;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
我如何将结果进一步向下传递
我的理解是您使用
Task API
的是 Google Play 服务。如果是这种情况,那么你为什么在这里并不完全清楚
RxJava
,如果只是为了多线程,那么task
它已经在另一个线程中执行了。您还可以在任务的回调函数中实现天气请求的启动,addOnSuccessListener
如下所示:但是如果在请求位置时仍然需要使用它
RxJava
,那么根据文档Task API
,如果您的代码已经在另一个线程上运行(在后台),那么您可以task
同步执行(通过阻塞代码执行)并避免回调. 在您的情况下,由于它taskSingle
计划在不同的线程中运行,它看起来像这样: