2017-02-10 12 views
4

Я новичок с RxJava и просто пытается реализовать несколько примеров, чтобы лучше понять, что происходит, так что я, что я думал, что это EditText, который является Observable и излучает textChangeEvent с с использованием RxBinding библиотека:Объединить RxTextView события изменения текста с Retrofit вызова

 RxTextView.textChangeEvents(searchbar.getEditText()) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .filter(new Func1<TextViewTextChangeEvent, Boolean>() { 
       @Override 
       public Boolean call(TextViewTextChangeEvent text) { 
        return (text.text().length() > 2); 
       } 
      }) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(Schedulers.io()); 

и Retrofit апи вызов, где текст для вызова из приведенного выше Observable.

Я объявил функцию:

@Override 
public Observable<SearchResponse> executeSearch(Observable<RxTextView> queryText) { 
    return searchService.getSearch(queryText) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

И теперь я должен объединить эти два так, когда текст изменений есть новый Retrofit вызова, но я не знаю, как я могу «пройти» queryText в обслуживание.

Я также попытался:

Observable<TextViewTextChangeEvent> 
    searchBarText = RxTextView.textChangeEvents(searchbar.getEditText()) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .filter(new Func1<TextViewTextChangeEvent, Boolean>() { 
       @Override 
       public Boolean call(TextViewTextChangeEvent text) { 
        Timber.i("Executes!!! text : %s", text.text().toString()); 
        return (text.text().length() > 2); 
       } 
      }) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(Schedulers.io()); 

    Observable.combineLatest(executeSearchTypeOne(searchBarText), executeSearchTypeTwo(searchBarText), 
        new Func2<TypeOne, TypeTwo, Object>() { 
         @Override 
         public Object call(TypeOne one, TypeTwo two) { 

          return null; 
         } 
        }) 
      .subscribe(new Action1<Object>() { 
       @Override 
       public void call(Object o) { 
        Timber.i("WORKS!!!"); 
       } 
      }); 

, где я хочу запустить два Retrofit вызовов одновременно на основе EditText изменений, но они не работают на всех

ответ

2

Я предполагаю, что тип параметра searchService.getSearch queryText является строкой , и возвратите Наблюдаемое Данные.

Я бы написать это таким образом:

RxTextView.textChangeEvents(searchbar.getEditText()) 
     .debounce(400, TimeUnit.MILLISECONDS) 
     .map(new Func1<TextViewTextChangeEvent, String>() { 
      @Override 
      public String call(TextViewTextChangeEvent text) { 
       return text.text().toString(); 
      } 
     }) 
     .filter(new Func1<String, Boolean>() { 
      @Override 
      public Boolean call(String text) { 
       return (text.length() > 2); 
      } 
     }) 
     .flatMap(new Func1<String, rx.Observable<Data>>() { 
      @Override 
      public rx.Observable<Data> call(String text) { 
       return getSearch(text); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) // Or Schedulers.newThread() 
     .observeOn(AndroidSchedulers.mainThread()); 

Это Наблюдаемый из данных, от Наблюдаемых из TextViewTextChangeEvent отображается в строку в цепь с getSearch, наблюдаемыми данными.

Для Котлин (первоначальное предложение убийцы):

RxTextView.textChangeEvents(searchbar.getEditText()) 
       .debounce(400, TimeUnit.MILLISECONDS) // Better store the value in a constant like Constant.DEBOUNCE_SEARCH_REQUEST_TIMEOUT 
       .map { it.text().toString() } 
       .filter { it.length > 2 } 
       .flatMap { getSearch(it) } // Or .flatMap(this::getSearch) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe { ... } 

Примечание: RxTextView.textChanges не будет излучать текстовые изменения, как только метод OnError() запускается. Артикул: https://github.com/JakeWharton/RxBinding/issues/272

 Смежные вопросы

  • Нет связанных вопросов^_^