我正在尝试使用Retrofit学习RxJava。所以这可能是一个简单的问题。
我想在Retrofit api调用上编写一个包装器方法。此方法将显示和隐藏进度视图,并在开始呼叫和完成呼叫之前执行其他一些操作。
这是我的服务方法
@GET("/books")
Observable<List<Book>> getBooks();
现在,在实际拨打电话之前,我想要显示进度视图。
public <T> void execute(Observable<T> observable, final RequestHandler<T> callback) {
observable = observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
progressDialog = new TransparentProgressDialog(context, progressViewColor);
progressDialog.setCancelable(false);
dismissProgressDialog();
progressDialog.show();
observable.subscribe(new Observer<T>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable t) {
///Handle error
}
@Override
public void onNext(T t) {
/// Call the callback
}
});
}
从代码中可以看出,我传递了一个接口(RequestHandler
),我调用了错误和onNext
。我能够做到这一点。但这与正常的回调实现没有什么不同。根据我的理解,可观察的应该是可链接的。但我不确定如何实现这一点,以便可以观察到可观察性。
有人可以帮助我吗?
由于
答案 0 :(得分:0)
好好阅读有关MVP模式的内容。 创建一些将执行请求和处理响应的演示者。在此演示者内部创建BehaviourSubject并根据您的需要使用所需的布尔值向其发出onNext值。
import retrofit.Callback;
import retrofit.RetrofitError;
import rx.Observable;
import rx.subjects.BehaviorSubject;
public class TestTest {
public final BehaviorSubject<Boolean> progressSubject = BehaviorSubject.create(true);
public final Observable<SomeResponse> responseObservable;
public TestTest(ApiService apiService) {
responseObservable = apiService.performRequest(new Callback<SomeResponse>() {
@Override
public void success(SomeResponse someResponse, retrofit.client.Response response) {
progressSubject.onNext(false);
}
@Override
public void failure(RetrofitError error) {
progressSubject.onNext(false);
}
});
}
public Observable<Boolean> progressObservable() {
return progressSubject;
}
}
然后在fragment / activity中订阅progressObservable,如
presenter.progressObservable()
.compose(this.<Boolean>bindToLifecycle())
.subscribe(RxView.visibility(progressBar));
presenter.someResponseObservable()...
请注意,在上面的示例中,进度将从头开始显示,因为“true”是BehaviourSubject的初始值。 请记住,您必须订阅reponseObservable。没有它,上面的代码将导致无休止的进展。