RxJava - Observable,它发出新的或更改的项目

时间:2018-03-01 10:36:15

标签: android observable reactive-programming rx-java2 rx-android

我是反应世界的新手,并尝试使用rxjava / rxandroid 2.x实现以下方案。

我在Application类中有一个本地数据集作为ArrayList mItems。相同的数据集与服务器同步,并在每次用户打开应用程序时更新。但是,在服务器返回响应之前,我想在适配器支持的RecycleView中显示本地数据集。 一旦返回响应,适配器就应该使用delta更新列表,而不会干扰UI中的顺序。

到目前为止,我已经尝试过这个:

public Observable<List<Item>> getItemsObservable() {
    Observable<List<Item>> observeApi = itemServiceAPI.getItemsForUser(accountId);
    if (mItems != null) {
        return Observable.just(mItems).mergeWith(observeApi);
    } else {
        return observeApi;
    }
}

要更新UI,请按以下方式调用上述方法:

Observable<List<Item>> itemsObservable = appContext.getItemsObservable();
            itemsObservable.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new DefaultObserver<List<Item>>() {
                        @Override
                        public void onNext(List<Item> Items) {
                            // Code to update the adapter
                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onComplete() {

                        }
                    });

这样我就可以为每个本地数据集和远程数据集调用两次onNext。如何实现所需的功能?是否需要使用过滤器运算符来排除项目​​?

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

<强>更新

首先,你为什么要使用Observable.just(mItems) ???这是不必要的。

您的代码应该是

itemServiceAPI.getItemsForUser(accountId)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DefaultObserver<List<Item>>() {
                @Override
                public void onNext(List<Item> Items) {
                    // Code to update the adapter

                    mAdapter.updateItems(items);

                    /* method in adapter class
                    * 
                    *  public void updateItems(List<Item> mList) {
                              this.items.addAll(mList);
                              notifyDataSetChanged();
                          }
                    * */
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

此处,您的适配器将在onNext中更新。确保在调用API之前,必须使用本地项设置适配器。

答案 1 :(得分:0)

您可以使用'startWith'运算符:它首先订阅不同的observable。 appContext.getItemsObservable() .startWith(localCacheObservable) .subscribe(adapter::updateData) 适配器的更新数据应该处理差异计算。