我正在使用RxJava和Retrofit,我正在尝试找到一种非常简洁的方法来抽象我的API调用,以便最大限度地减少Activity中的代码 .

到目前为止,我有这样的事情:

Observable<SomeObservable> combined =
            Observable.zip(firstObservable, secondObservable, SomeObservable::new);

    // Works but needs header parsing
    RxRestNetworker.performAsyncApiCall(combined, (returnData) -> {
        // onNext() implementation
    }, () -> hideSuggestionProgress());

RxRestNetworker类如下所示:

public class RxRestNetworker {
private static final String LOG_TAG = RxRestNetworker.class.getCanonicalName();

// Default error handling
private static Action1<Throwable> mOnError = throwable -> {
    Log.e(LOG_TAG, throwable.getMessage());
    throwable.printStackTrace();
};

/**
 * Perform the desired request with default error handling
 * @param observable
 * @param onAction
 * @param <T>
 * @return
 */
public static <T> Subscription performAsyncApiCall(Observable<T> observable, Action1<? super  T> onAction, Action0 onComplete) {
    // Use default error handling
    return performAsyncApiCall(observable, onAction, mOnError, onComplete);
}

/**
 * Perform the desired request with some error handling OTHER than the default one
 * @param observable
 * @param onAction
 * @param onError
 * @param <T>
 * @return
 */
public static <T> Subscription performAsyncApiCall(Observable<T> observable, Action1<? super T> onAction, Action1<Throwable> onError, Action0 onComplete) {
    return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(onAction, onError, onComplete);
}

}

所以你可以看到我通过调用第一个performAsyncApiCall方法使用默认的onError() .

现在一切正常,但我需要通过访问响应对象来访问响应的标头 .

This帖子声称我应该包装我的响应对象并在API中声明它:

Observable<Response<SomeResponse>> getThings();

但我真的不关心那个 . 它看起来很丑陋,并且像上面那样令人难以忘怀 .

理想情况下,我想创建onNext()Action1参数的抽象,该参数可以默认记录标头并为每个API调用执行任何其他操作,然后将调用结果传递回调用方 . 我是否会朝这个方向走错路?有人可以帮我找一个以非常干净的方式抽象的方法吗?

谢谢!