如何使用Retrofit同时获取两个对象 - 原始响应对象和POJO?

时间:2014-09-25 06:07:53

标签: android retrofit rx-java

我在项目中使用Retrofit / OkHttp,最近我发现了RxJava。将它与Retrofit结合起来似乎既简单又直接,但在success(...)中的Retrofit中使用常规异步回调,我们正在接收已解析的POJO和响应。这非常有用,在我的一些回调中,我正在使用这两个对象。我似乎无法用RxJava找到一种方法。

是否可以同时获取已解析的POJO和Response对象?

1 个答案:

答案 0 :(得分:2)

RxJava的工作方式是onNext方法总是只发出一个值,所以你不会得到类似的东西(因为它会违反合同):

onNext(T value, Response respone);

最接近的可能是Observable<ResponseAndPojo<T>>,其中ResponseAndPojo如下:

public class ResponseAndPojo<T> {

    private final T value;
    private final Response response;

    public ResponseAndPojo(T value, Response response) {
        this.value = value;
        this.response = response;
    }

    // add getters here
}

这样的Observable随后会发出以下项目:

onNext(ResponseAndPojo<T> responseAndPojo)

您可以访问Response和POJO。

现在,如何构建这样一个Observable:

一种方法是创建某种Subject(可能是BehaviorSubject,但对于单个请求它并不重要)然后在Retrofit success方法中放回值Subject

所以,在某种你自己的RetrofitWrapper类中你会有

public Observable<ResponseAndPojo<YourPojoClass>> getResponseAndPojoObservable() {
    final BehaviorSubject<ResponseAndPojo<YourPojoClass>> retrofitSubject = BehaviorSubject.<ResponesAndPojo<YourPojoClass>>create();

    yourRetrofitService.getSomething(new Callback<YourPojoClass>() {

        @Override
        public void success(YourPojoClass pojo, Response response) {
            retrofitSubject.onNext(new ResponseAndPojo(pojo, response);
            retrofitSubject.onCompleted();
        }
    });

    return retrofitSubject;
}

正如您所看到的,Subject从外部看起来像Observable<ResponseAndPojo<YourPojoClass>>,这正是我们想要的。