2016-12-25 53 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链。

如果您需要对所有人进行一些处理,那么您需要调整模型以反映这一点,即使它只是包装类。