Android Rx concatWith()仅返回第一个可流动结果

Android Rx concatWith()仅返回第一个可流动结果,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我已经发布了所有的方法,它们是分开工作的,但是我面临第一个方法的问题,在第一个方法中,我使用了两个flowables return userFavouriteStores() .concatWith(userOtherStores()) .doOnNext(new Consumer<List<StoreModel>>() { @Override public void accept(@io.reactivex.annotati

我已经发布了所有的方法,它们是分开工作的,但是我面临第一个方法的问题,在第一个方法中,我使用了两个flowables

    return userFavouriteStores()
    .concatWith(userOtherStores())
   .doOnNext(new Consumer<List<StoreModel>>() {
      @Override
      public void accept(@io.reactivex.annotations.NonNull List<StoreModel> storeModels) throws Exception {
        Log.i("storeModels", "" + storeModels);
      }
    })


public Flowable<List<StoreModel>> userFavouriteStores() {
return userStores()
    .map(UserStores::favoriteStores)
    .flatMap(storeId -> storeDao.storesWithIds(storeId))
    .map(stores -> { // TODO Konvert to Kotlin map {}
      List<StoreModel> result = new ArrayList<>(stores.size());
      for (se.ica.handla.repositories.local.Store store : stores) {
        result.add(store.toStoreModel(StoreModel.Source.Favourite));
      }
      return result;
    });  }

public Flowable<List<StoreModel>> userOtherStores() {
return userStores().map(UserStores::otherStores)
    .flatMap(storeId -> storeDao.storesWithIds(storeId))
    .map(stores -> {
      List<StoreModel> result = new ArrayList<>(stores.size());
      for (Store store : stores) {
        result.add(store.toStoreModel(StoreModel.Source.Other));
      }
      return result;
    });}
更新方法:userStores用于收藏夹和其他商店

  private Flowable<UserStores> userStores() {
return apiIcaSeResource
    .userStores()
    .toFlowable(); }

  @GET("user/stores")
Single<UserStores> userStores();

在后续的评论和其他信息之后,你对concat没有什么特别的问题,我假设它是有效的,它不是你想要实现的工具

concat不会将两个列表连接到一个列表中,但是Rat会首先通过第一个Flowable发出所有项目,然后才通过第二个Flowable发出项目,因此您必须具有onComplete,以便concat会知道Flowable何时结束,这是我在开始时询问的

为了将列表组合在一起,我建议压缩这两个存储Obesrvables favorites/others,然后简单地组合到列表,以获得组合列表的单个输出。 除此之外,正如您所指出的,由于两个可观察的存储都来自userStores,因此您将调用网络请求两次,这绝对不是必需的。您可以使用publish来解决这个问题,publish将共享网络结果并将其多播到两个可观察对象,从而产生单个网络请求

总的来说,我建议在这里使用单一的,不流动的,因为你们并没有背压。类似于以下实现:

Observable<List<StoreModel>> publish = userStores()
        .toObservable()
        .publish(userStores ->
                Single.zip(
                    userFavouriteStores(userStores.singleOrError()),
                    userOtherStores(userStores.singleOrError()),
                    (favoriteStores, otherStores) -> {
                         favoriteStores.addAll(otherStores);
                         return favoriteStores;
                    }
                )
                    .toObservable()
        );

userStores方法做什么?确保流动火焰完成,否则concat将无法工作我想知道会发生什么事?@Habib Okanla他们每个人都会发射3个物品,六项合一flowable@yosriz我已经更新并发布了userStoresmethod@yosriz我已经更新并发布了userStores方法和第二种方法,concat的第二部分还没有到达