Android RxJava-可观察的,它发出新的或更改的项

Android RxJava-可观察的,它发出新的或更改的项,android,observable,reactive-programming,rx-java2,rx-android,Android,Observable,Reactive Programming,Rx Java2,Rx Android,我是被动世界的新手,尝试用rxjava/rxandroid 2.x实现以下场景 我有一个本地数据集作为应用程序类中的ArrayList mItems。同一数据集与服务器同步,并在用户每次打开应用程序时更新。但是,在服务器返回响应之前,我想在由适配器支持的RecycleView中显示本地数据集一旦返回响应,适配器应使用增量更新列表,而不会干扰UI中的顺序。 到目前为止,我已经尝试过: public Observable<List<Item>> getItemsObserva

我是被动世界的新手,尝试用rxjava/rxandroid 2.x实现以下场景

我有一个本地数据集作为应用程序类中的ArrayList mItems。同一数据集与服务器同步,并在用户每次打开应用程序时更新。但是,在服务器返回响应之前,我想在由适配器支持的RecycleView中显示本地数据集一旦返回响应,适配器应使用增量更新列表,而不会干扰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;
    }
}
public Observable getItemsBServable(){
ObservableAppi=itemServiceAPI.getItemsForUser(accountId);
if(mItems!=null){
返回Observable.just(mItems).mergeWith(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() {

                        }
                    });
Observable itemsObservable=appContext.getItemsObservable();
itemsObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新的DefaultObserver(){
@凌驾
public void onNext(列表项){
//更新适配器的代码
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
});
通过这种方式,我可以为每个本地数据集和远程数据集调用两次onNext。如何实现所需的功能?是否需要使用筛选器运算符来排除项目


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

更新

首先,为什么要使用
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() {

                }
            });
itemServiceAPI.getItemsForUser(accountId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新的DefaultObserver(){
@凌驾
public void onNext(列表项){
//更新适配器的代码
mAdapter.updateItems(项目);
/*适配器类中的方法
* 
*公共无效更新项(列表mList){
此.items.addAll(mList);
notifyDataSetChanged();
}
* */
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
未完成的公共空间(){
}
});

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

您可以使用“startWith”操作符:它首先订阅不同的可观察项。
appContext.getItemsBServable()
.startWith(localCacheObservable)
.subscribe(适配器::updateData)

适配器的更新数据应处理差异计算

我已经更新了我的答案。仔细检查。
只是
会让观察者发出本地可用的项目。在我的问题中,我提到我需要在服务器响应之前向用户显示数据集。我想实现的是,使用同一个观察者,在本地和远程进行观察,并使用独占项触发。好的。我先试试这个。