我正在使用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调用执行任何其他操作,然后将调用结果传递回调用方。我是否会朝这个方向走错路?有人可以帮我找一个以非常干净的方式抽象出来的方法吗?
谢谢!