不能合并RXJava2

时间:2018-05-30 08:50:13

标签: java observable rx-java2

您好我是RXJava的新手。

我试图从包含一个arraylist的多个Observable中获取Users。我想合并两个数据并将其发布到Observer。

这是我的代码段。

    Observable<Users> baseDataObservable = mService.getUsers(Constants.SITE);

    Items items = new Items();
    items.setName("User Defined...");
    items.setImageURL("http://www.proto.gr/sites/www.proto.gr/files/styles/colorbox/public/images/fruits/cherry.png");
    ArrayList<Items> items1 = new ArrayList<>();
    items1.add(items);

    Users users = new Users();
    users.setItems(items1);
    Observable<Users> usersObservable = Observable.just(users);

    Observable.merge(baseDataObservable, usersObservable)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);

在上面的代码中,第一个observable带来了来自API的数据,第二个带来了用户定义的数据。

但是当我在观察者上使用merge时,ArrayList<Items>中只有单个数据设置定义数据,最初来自api的数据显示第二个可观察数据提供的数据。

有人可以帮助我

1 个答案:

答案 0 :(得分:1)

如果您尝试“合并”两个来源的阵列列表,并且需要将这些列表合并到一个列表中,则需要使用zip运算符而不是mergemerge运算符将在任何可观察量触发时立即发出项目,其中zip将从所有输入可观察量中收集结果并在此之后继续。

在你的方法中,观察者将触发两次,结果为2。首先是用户定义的项目, 然后来自API的结果(自API调用以来有延迟)

尝试这样来获得综合结果

        Observable.zip(baseDataObservable, usersObservable, new BiFunction<Users, Users, ArrayList<Items>>() {
        @Override
        public ArrayList<Items> apply(Users usersFromApi, Users usersUserDefined) throws Exception {
            ArrayList<Items> itemsArrayList = new ArrayList<>();
            itemsArrayList.addAll(usersFromApi.getItems());
            itemsArrayList.addAll(usersUserDefined.getItems());
            return itemsArrayList;
        }
    }).subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableObserver<ArrayList<Items>>() {
                @Override
                public void onNext(ArrayList<Items> items) {
                    // here is the combined Arraylist
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });