【问题标题】:Wait for location and then execute retrofit call with rxjava等待定位,然后使用 rxjava 执行改造调用
【发布时间】:2016-04-12 15:19:22
【问题描述】:

在我的应用程序中,我需要等待用户位置,然后执行改造(收到位置时)。

我有可观察的工作

mlocationService.getLocation()
            .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(location -> {
                Log.d(TAG, "COORDS: " + location.getLatitude() + ", " + location.getLongitude());
            }, e -> Log.e(TAG, e.getMessage()));

但是现在我需要通过改造调用来调用第二个 observable,有没有比将第二个 observable 嵌套在第一个的 onNext() 中更好的方法?

谢谢

【问题讨论】:

    标签: android retrofit rx-java rx-android


    【解决方案1】:

    是的,您可以使用flatmap 运算符:

    mlocationService.getLocation()
            .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .flatmap(location -> retrofitApi.getData(location))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(...)
    

    订阅现在将获得改造调用的结果

    如果您需要同时返回改造结果和位置,则可以使用 zip 运算符:

    mlocationService.getLocation()
            .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .flatmap(location -> Observable.zip(
                retrofitApi.getData(location),
                Observable.just(location),
                (Func2<Response<Data>, Location, ResponseLocation>) (response, location) -> {
                    return new ResponseLocation(response, location)
                }
            ))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(...)
    

    其中 ResponseLocation 只是一个获取位置和改造结果的类。然后订阅将获得一个 ResponseLocation 作为它的参数。

    编辑

    要在调用 Retrofit 之前使用该位置,只需扩展 lambda:

    mlocationService.getLocation()
            .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .flatmap(location -> {
                updateMap(location);
                return retrofitApi.getData(location);
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(...)
    

    【讨论】:

    • 非常感谢。它帮助很大。
    • 但是现在我怎样才能访问位置?我还需要用新位置更新地图。
    • 您可以使用 zip 运算符将位置与改造结果结合起来。我会更新答案...
    • 感谢您的回答,但我需要实现的是:尽快获取位置 用新位置更新UI,然后调用改造。在您的示例中,应用程序等待两个任务完成然后交付结果。
    • 嗯,好的。在这种情况下,您可以在调用改造之前使用平面图中的位置。我会再更新的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多