RxJava Android和Retrofit中的钩子行​​为

时间:2016-04-23 17:10:04

标签: android retrofit rx-java rx-android

我正在尝试使用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。我能够做到这一点。但这与正常的回调实现没有什么不同。根据我的理解,可观察的应该是可链接的。但我不确定如何实现这一点,以便可以观察到可观察性。

有人可以帮助我吗?

由于

1 个答案:

答案 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。没有它,上面的代码将导致无休止的进展。