【问题标题】:Hook behaviour in RxJava Android and RetrofitRxJava Android 和 Retrofit 中的钩子行​​为
【发布时间】:2016-08-17 06:28:48
【问题描述】:

我正在尝试通过 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 时调用该接口。我能够得到这个工作。但这与正常的回调实现没有什么不同。根据我的理解,observable 应该是可链接的。但我不确定如何实现它以便可以链接可观察对象。

有人可以帮我吗?

谢谢

【问题讨论】:

    标签: android retrofit rx-java rx-android


    【解决方案1】:

    阅读有关 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;
        }
    }
    

    然后在片段/活动中订阅progressObservable like

        presenter.progressObservable()
                .compose(this.<Boolean>bindToLifecycle())
                .subscribe(RxView.visibility(progressBar));
    
        presenter.someResponseObservable()...
    

    请注意,在上面的示例中,从一开始就可以看到进度,因为“true”是 BehaviourSubject 的初始值。 请记住,您必须订阅 reponseObservable。如果没有它,上面的代码将导致无穷无尽的进步。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2016-01-11
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多