2016-12-25 3 views
1

У меня есть searchBar (EditText) с четырьмя вкладками под ним (каждая вкладка должна показывать разные результаты). Я использую RxJava с RxBinding для прослушивания и реагирования на события с изменениями текста, и я использую оператор switchMap() для выполнения службы Retrofit для каждого изменения изменения текста.Как выполнить различные запросы на переоснащение внутри оператора switchMap() RxJava?

Поскольку пользователь может выбрать любую из четырех вкладок, я фактически выполняю соответствующий запрос Retrofit для этой вкладки. Для каждого из этих Retrofit услуг я получаю другой объект ответа.

Как я могу обрабатывать разные типы возврата внутри switchMap(), так как последний нужен общий тип для всех?

Я уже задал аналогичный question, но ответ во время его работы не позволяет мне использовать данные у моего подписчика. Или мой подход неправильный с самого начала, и я должен попробовать другой подход?

Код:

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()) 
      .switchMap(new Func1<TextViewTextChangeEvent, Observable<Void>>() { 
       @Override 
       public Observable<Void> call(TextViewTextChangeEvent textViewTextChangeEvent) { 

        String searchBarText = textViewTextChangeEvent.text().toString(); 

        switch (visibleTab) { 
         case TAGS: 
          presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)); 
         case PEOPLE: 
          return presenter.executeSearchPostsByPeople(searchBarText, String.valueOf(0)); 
         case COMPANIES: 
          return presenter.executeSearchPostsByCompanies(searchBarText, String.valueOf(0)); 
         case JOBS: 
          return presenter.executeSearchPostsByJobs(searchBarText, String.valueOf(0)); 
         default: 
          return presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)); 
        } 

       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Void>() { 
       @Override 
       public void onCompleted() { 
        Timber.i("ON COMPLETED"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Timber.i("ON ERROR e : %s", e.getMessage()); 
       } 

       @Override 
       public void onNext(Void aVoid) { 
        Timber.i("ON NEXT"); 
       } 
      }); 

В коде выше вы увидите, что у меня есть тип возвращаемого Observable, но это не работает, я просто добавил это так, вы увидите, что я делаю.

ответ

1

Вещь в том, что любой из методов executeSearchPostsBy* возвращает непустую Наблюдаемый? Если все их Наблюдаемые пустые, то вы можете просто наклеить на .cast(Void.class) всем им. Если они возвращают непустые наблюдаемые данные, но вы не заботитесь о предметах, тогда нажмите на .ignoreElements().cast(Void.class).

Если вам нужно выполнить некоторую обработку для всего, что возвращается, то вы должны сделать это разными способами в своих собственных цепях Observable.

Если вам необходимо выполнить некоторую обработку, которая является общей для всех из них, вам необходимо настроить свою модель, чтобы отразить это, даже если это просто классы-оболочки.