是否有可能在rxjava android中的订阅者的onNext()中获得2个值?

时间:2016-03-23 11:42:02

标签: android rx-java

我有这样的观察

Observable.zip(observable, extObs, new Func2<List<UserProfile>, ArrayList<Extension>, UserProfile>() {
        @Override
        public UserProfile call(List<UserProfile> userProfiles, ArrayList<Extension> extensions) {


            return userProfiles.get(0);
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).unsubscribeOn(Schedulers.io()).subscribe(new Subscriber<UserProfile>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
        }

        @Override
        public void onNext(UserProfile userProfile) {
            profileListener.onProfileSet(userProfile);
        }
    });
}

我需要将方法profileListener.onProfileSet(userProfile);中的ArrayList作为profileListener.onProfileSet(userProfile,extensions);

传递

是否可以在zip中执行此操作,还是有其他rxjava方法来解决此类问题?

1 个答案:

答案 0 :(得分:13)

您必须完全按照评论中建议的cricket_007进行操作。

例如:

  1. 创建一个代表您的observables组合结果的类:
  2. class CombinedResults {
        public UserProfile userProfile;
        public List<Extension> extensions;
    
        public CombinedResults(UserProfile userProfile, List<Extension> extensions) {
            this.userProfile = userProfile;
            this.extensions = extensions;
        }
    }
    

    (或者您可以使用Pair类)

    1. CombinedResults Pair中使用Observable.zip(或Func2)的对象。
    2. Observable.zip(observable, extObs,
              new Func2<List<UserProfile>, ArrayList<Extension>, CombinedResults>() {
                  @Override
                  public CombinedResults call(List<UserProfile> userProfiles, ArrayList<Extension> extensions) {
                      return new CombinedResults(userProfiles.get(0), extensions);
                  }
              })
              .subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .unsubscribeOn(Schedulers.io())
              .subscribe(new Subscriber<CombinedResults>() {
                  @Override
                  public void onCompleted() {
      
                  }
      
                  @Override
                  public void onError(Throwable e) {
                      e.printStackTrace();
                  }
      
                  @Override
                  public void onNext(CombinedResults combined) {
                      profileListener.onProfileSet(combined.userProfile, combined.extensions);
                  }
              });