rx-android之如何使用 RxBinding & Retrofit

java哥 阅读:55 2024-10-25 08:56:14 评论:0

这是我的代码:

// 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(); 


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号