2016-12-25 71 views
1

我有一個搜索欄(一個EditText)下面有四個標籤(每個標籤應顯示不同的結果)。我使用RxJava和RxBinding來監聽和響應文本更改事件,並且我使用switchMap()運算符爲每個文本更改排放執行Retrofit服務。如何在RxJava的switchMap()運算符中執行不同的改造請求?

由於用戶可以選擇四個選項卡中的任何一個,我實際上對該選項卡執行相應的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"); 
       } 
      }); 

在上面的代碼中你會看到我的可觀收益型但不工作我只是說,這樣你會看到我在做什麼。

回答

1

事情是,做任何的executeSearchPostsBy*方法返回一個非空的Observable?如果他們所有的觀察物都是空的,那麼你可以在.cast(Void.class)上加上它們。如果他們確實返回非空的可觀察物,但你不關心這些物品,那就試試.ignoreElements().cast(Void.class)

如果您需要對返回的任何內容進行一些處理,那麼您應該在不同的方法中使用它們自己的Observable鏈。

如果您需要對所有人進行一些處理,那麼您需要調整模型以反映這一點,即使它只是包裝類。