2016-03-02 4 views
3

voici mon code:comment utiliser 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); 
           } 
          }); 
       } 
      }); 

Est-il possible que vous pouvez combiner les Observable de RxView et Observable de rénovation?

Je pense que le code est moche et ne répond pas aux spécifications de ReactiveX.

Répondre

5

Oui, vous pouvez utiliser l'opérateur .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(); 

aurait l'air un peu mieux avec lambdas:

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

ce qui est le 'apiService'? la demande http doit être en arrière-plan, puis obtenir le nom d'utilisateur et le mot de passe sur le thread principal, comment faire? –

+1

Dans mon exemple 'apiService' est le service que vous créez en utilisant Retrofit. Il fait l'appel sur un thread d'arrière-plan en utilisant 'Schedulers.io()', puis observe les résultats sur le thread principal. – Orbit

+1

mais vous devez obtenir le nom d'utilisateur et mot de passe lorsque RxView.clicks (mButton), vous oubliez l'étape. –