在回调rxjava中返回Observable

时间:2016-06-30 09:31:52

标签: java android rx-java reactive-programming

我正在使用google awareness api搞乱一些人,现在我对RxJava的理解限制了我。

我最终想要实现的目标: 我想从Api获取天气和位置,并将它们合并到一个对象中,我可以将其传递给我的视图进行更新。

但是,我不确定如何从api回调中返回一个Observable,因为它具有void返回类型,以及如何从api.getWeather和api.getLocation <实现天气和位置对象的合并/ p>

public void requestUserCurrentInfo() {
    Subscription userInfo = getWeatherLocation().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(userinfo ->
                    Log.d(TAG,userinfo.something()));
}

public Observable<UserInfo> getWeatherLocation () {
    try {
        Awareness.SnapshotApi.getWeather(client)
                .setResultCallback(weather -> {
                    if (!weather.getStatus().isSuccess()) {
                        Log.d(TAG, "Could not get weather");
                        return;
                    }
                    //How do I do here?
                    return weather.getWeather();
                });


        Awareness.SnapshotApi.getLocation(mGoogleApiClient)
            .setResultCallback(retrievedLocation -> {
                if(!retrievedLocation.getStatus().isSuccess()) return;
                Log.d("FRAG", retrievedLocation.getLocation().getLatitude() + "");
            });


    } catch (SecurityException exception) {
        throw new SecurityException("No permission " + exception);

    }

}

对于我项目中的其他内容,我在存储库模式之后通过REST api得到了一些东西,然后我可以这样得到它,因为每一步都返回一个Observable&lt; SmhiResponse&gt;

getWeatherSubscription = getWeatherUsecase.execute().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(
                    smhiResponseModel -> {Log.d(TAG,"Retrieved weather"); locationView.hideLoading();},
                    err -> {Log.d(TAG,"Error fetching weather"); locationView.hideLoading();}
            );

2 个答案:

答案 0 :(得分:1)

你不会从回调中返回一个observable,但是将你的回调包装成observables以使它们可以组合(未经测试):

    Observable<WeatherResult> weatherObservable = Observable.create(subscriber -> {
        Awareness.SnapshotApi.getWeather(client)
                .setResultCallback(weather -> {
                    if (!weather.getStatus().isSuccess()) {
                        subscriber.onError(new Exception("Could not get weather."));
                        Log.d(TAG, "Could not get weather");
                    } else {
                        //How do I do here?

                        subscriber.onNext(weather);
                        subscriber.onCompleted();
                    }
                });
    });

    Observable<LocationResult> locationObservable = Observable.create(subscriber -> {
        Awareness.SnapshotApi.getLocation(mGoogleApiClient)
                .setResultCallback(retrievedLocation -> {
                    if(!retrievedLocation.getStatus().isSuccess()) {
                        subscriber.onError(new Exception("Could not get location."));
                    } else {
                        Log.d("FRAG", retrievedLocation.getLocation().getLatitude() + "");
                        subscriber.onNext(retrievedLocation);
                        subscriber.onCompleted();
                    }
                });
    });

现在通过.combineLatest().zip()

组合它们
    Observable<CombinedResult> combinedResults = Observable.zip(weatherObservable, locationObservable,
            (weather, location) -> {
                /* somehow combine weather and location then return as type "CombinedResult" */
            });
不要忘记订阅,否则不会执行任何操作:

    combinedResults.subscribe(combinedResult -> {/*do something with that stuff...*/});

答案 1 :(得分:0)

enctype="multipart/from-data"

getweather()和getlocation()返回observables