2016-03-02 5 views
3

вот мой код:как использовать 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 и Observable от модернизации?

Я думаю, что код является уродливым и не соответствует спецификациям ReactiveX.

ответ

5

Да, вы бы использовать .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(); 

будет выглядеть немного лучше с лямбды:

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

что такое «apiService? http-запрос должен быть в фоновом потоке, а затем получить имя пользователя и пароль в mainthread, как это сделать? –

+1

В моем примере 'apiService' - это сервис, который вы создаете с помощью Retrofit. Он вызывает вызов в фоновом потоке с помощью 'Schedulers.io()', а затем возвращает результаты в основной поток. – Orbit

+1

, но вы должны получить имя пользователя и пароль, когда RxView.clicks (mButton), вы забудете этот шаг. –