Rx android 如何使用RxBinding&;改造?

Rx android 如何使用RxBinding&;改造?,rx-android,retrofit2,Rx Android,Retrofit2,这是我的密码: // Observable from RxView RxView.clicks(mBtnLogin) .throttleFirst(500, TimeUnit.MILLISECONDS) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) {

这是我的密码:

// 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中可以观察到
RxView.clicks(mBtnLogin)
.throttleFirst(500,时间单位为毫秒)
.订阅(新操作1(){
@凌驾
公共作废调用(作废避免){
字符串userName=mEditUserName.getText().toString();
字符串密码=mEditPassWord.getText().toString();
if(TextUtils.isEmpty(用户名)){
Toast.makeText(LoginActivity.this,R.string.input_user_name,Toast.LENGTH_SHORT).show();
返回;
}
if(TextUtils.isEmpty(密码)){
Toast.makeText(LoginActivity.this,R.string.input\u pass\u word,Toast.LENGTH\u SHORT).show();
返回;
}
LoginAction action=Constants.Reformation().create(LoginAction.class);
//可从改造中观察到
可观察调用=action.login(用户名,MD5.encode(密码));
call.subscribeOn(Schedulers.io())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
系统输出打印项次(“完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
e、 printStackTrace();
}
@凌驾
public void onNext(字符串s){
System.out.println(“下一个”+s);
}
});
}
});
有没有办法将RxView的可观测值与改装的可观测值结合起来


我认为代码很难看,不符合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();

什么是“apiService”?http请求必须在后台线程中执行,然后在主线程中获取用户名和密码,如何执行此操作?在我的示例中,
apiService
是您使用改型创建的服务。它使用
Schedulers.io()
在后台线程上进行调用,然后在主线程上观察结果。但在RxView时必须获取用户名和密码。单击(mButton),则忘记了该步骤。确定后,在发出网络请求时获取用户名和密码。我已经向您展示了如何组合观测值。我想我知道这个问题。主线程上的flatMap()和后台线程上的apiService。谢谢。
RxView.clicks(mButton)
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribeOn(AndroidSchedulers.mainThread())
                .flatMap(aVoid -> apiService.getResponse().subscribeOn(Schedulers.io()))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe();