如何使用RxBinding&Retrofit?

问题描述:

这里是我的代码:如何使用RxBinding&Retrofit?

// 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的观察到的,从改造中可观察到什么办法?

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

什么是 'apiService'? http请求必须在后台线程中,然后在主线程中获取用户名和密码,如何执行此操作? –

+1

在我的示例中,“apiService”是您使用Retrofit创建的服务。它使用'Schedulers.io()'在后台线程上调用,然后在主线程上观察结果。 – Orbit

+1

但是当RxView.clicks(mButton)时你必须得到用户名和密码,你忘记了这一步。 –