【问题标题】:how to use RxBinding & Retrofit?如何使用 RxBinding 和改造?
【发布时间】:2016-03-02 09:16:05
【问题描述】:

这是我的代码:

// Observable from RxView
RxView.clicks(mBtnLogin)
            .throttleFirst(500, TimeUnit.MILLISECONDS)
            .subscribe(new Action1<Void>() {
                @Override
                public void call(Void aVoid) {
                    String userName = mEditUserName.getText().toString();
                    String passWord = mEditPassWord.getText().toString();

                    if (TextUtils.isEmpty(userName)) {
                        Toast.makeText(LoginActivity.this, R.string.input_user_name, Toast.LENGTH_SHORT).show();
                        return;
                    }

                    if (TextUtils.isEmpty(passWord)) {
                        Toast.makeText(LoginActivity.this, R.string.input_pass_word, Toast.LENGTH_SHORT).show();
                        return;
                    }

                    LoginAction action = Constants.retrofit().create(LoginAction.class);
                    // Observable from Retrofit
                    Observable<String> call = action.login(userName, MD5.encode(passWord));
                    call.subscribeOn(Schedulers.io())
                            .subscribe(new Observer<String>() {
                                @Override
                                public void onCompleted() {
                                    System.out.println("completed");
                                }

                                @Override
                                public void onError(Throwable e) {
                                    e.printStackTrace();
                                }

                                @Override
                                public void onNext(String s) {
                                    System.out.println("next" + s);
                                }
                            });
                }
            });

有没有什么方法可以将 RxView 中的 Observable 和改造中的 Observable 结合起来?

我认为代码很丑,不符合 ReactiveX 的规范。

【问题讨论】:

    标签: rx-android retrofit2


    【解决方案1】:

    是的,您将使用.flatMap() 运算符:

    RxView.clicks(mButton)
                    .throttleFirst(500, TimeUnit.MILLISECONDS)
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .flatMap(new Func1<Void, Observable<Response>>() {
                        @Override
                        public Observable<Response> call(Void aVoid) {
                            return apiService.getResponse().subscribeOn(Schedulers.io());
                        }
                    })
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe();
    

    使用 lambda 会更好看:

    RxView.clicks(mButton)
                    .throttleFirst(500, TimeUnit.MILLISECONDS)
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .flatMap(aVoid -> apiService.getResponse().subscribeOn(Schedulers.io()))
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe();
    

    【讨论】:

    • 什么是'apiService'? http请求必须在后台线程,然后在主线程获取用户名和密码,如何做到这一点?
    • 在我的示例中,apiService 是您使用 Retrofit 创建的服务。它使用Schedulers.io() 在后台线程上进行调用,然后在主线程上观察结果。
    • 但是RxView.clicks(mButton)的时候必须要获取用户名和密码,你忘了这一步。
    • 好的,然后在您发出网络请求时获取用户名和密码。我已经向你展示了如何组合 Observables。
    • 我想我知道问题所在。主线程上的 flatMap(),后台线程上的 apiService。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多