rx-android - 如何使用 RxBinding & Retrofit?

标签 rx-android retrofit2

这是我的代码:

// 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 和来自 retrofit 的 Observable 结合起来吗?

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

最佳答案

是的,您将使用 .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();

关于rx-android - 如何使用 RxBinding & Retrofit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742872/

相关文章:

android - 如何使用 Retrofit 2 处理错误响应?

android - 从 Observable 获取元素的索引

带有比较器类的android rxjava排序列表

java - 使用模拟器通过 Retrofit 将我的 REST API 与 Android Studio 连接起来

java - 使用 JSONObject 调用改造。

java - 从 RetrofitClient 内的 SharedPreferences 获取 BASE_URL

Android + RxJava - 从数据库和网络服务加载数据

android - 使用 Retrofit 和 RxJava,当 JSON 不直接映射到模型对象时,如何反序列化 JSON?

android - RxJava 的 .debounce() 干扰了我的 Observable 的线程和错误处理

android - 如何在 Android 中实现 webhook?