我正在使用 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);
}
}
所以你可以看到我通过调用第一个
onError()
方法来使用默认的 performAsyncApiCall
。
现在这一切都有效了,但我需要通过访问响应对象来访问响应的标头。
This 帖子声称我应该包装我的响应对象并在 API 中像这样声明它:
Observable<Response<SomeResponse>> getThings();
但我并不关心这个。它看起来很丑,并且让像上面这样的压缩可观察量变得令人头疼。
理想情况下,我想创建
onNext() Action1
参数的抽象,它可以默认记录标头并为每个 API 调用执行其他操作,然后将调用结果传递回调用者。我这样做是不是走错了方向?有人可以帮我找到一种以非常干净的方式抽象这一点的方法吗?
为 RxJava 和 Retrofit 创建自定义
onNext()
实现来高效处理 API 调用和响应标头,是抽象和最小化 Activity 中代码的好方法。阅读: