RxJava2,OrmLite - 一个可观察的,多个订阅者 - 为所有订阅者重复数据

时间:2017-07-18 17:17:47

标签: observable ormlite rx-java2 observers

我使用ormlite并将数据库数据转换为rx Observable。

array

我有三个不同的类A,B,C。在这个类中,我创建了三个观察者。我订阅了observable。

bananas, strawberries, peaches, oranges, bananas, strawberries, peaches, oranges

之后我更改了A类中的数据并更新了数据库。 是否有办法为所有观察者说明可重复的新数据?

或者我需要再次编写此代码?

public static <T> Observable<T> createObservable(@NonNull Observable<T> observable) {
    return observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}


public Observable<List<Country>> getCountriesObservable() {
    return RxUtils.createObservable(new Observable<List<Country>>() {
        @Override
        protected void subscribeActual(Observer<? super List<Country>> observer) {
            try {
                List<Country> list = mCountryDao.getCountries();
                observer.onNext(list == null ? Collections.<Country>emptyList() : list);
                observer.onComplete();
            } catch (SQLException exc) {
                Log.e(TAG, exc.getMessage());
                observer.onError(exc);
            }
        }
    });
}

1 个答案:

答案 0 :(得分:0)

免责声明:我没有直接使用RxJava的经验,只有Rx.NET,RxJS和RxSwift(我在10年多的时间里没有完成Java开发)

首先,我建议在订阅之前在observable上使用share()运算符。这可以确保您不需要额外的工作:

Observable<List<Country>> sharedObservable = observable.share();

sharedObservable.subscribe(observerA);
sharedObservable.subscribe(observerB);
sharedObservable.subscribe(observerC);

可观察的是数据流。现在它只包含一个值,但您可以使它返回多个值。所有订阅者当然都会收到新的值。

您需要通知数据已更新,然后在发生这种情况时生成新值。在任意可观察中创建值的简单方法是使用Subject。主题有点“un-Rx-y”,但为了简单起见,我会在这里使用一个:

// All this inside the same class

private PublishSubject<Object> updatesSubject = new PublishSubject<Object>();

public void SignalUpdate(){
    updatesSubject.onNext(new Object());
}

public Observable<List<Country>> getCountriesObservable() {
    return updatesSubject
        .startWith(new Object)
        .flatMap(_ -> RxUtils.createObservable(new Observable<List<Country>>() {
            @Override
            protected void subscribeActual(Observer<? super List<Country>> observer) {
                try {
                    List<Country> list = mCountryDao.getCountries();
                    observer.onNext(list == null ? Collections.<Country>emptyList() : list);
                    observer.onComplete();
                } catch (SQLException exc) {
                    Log.e(TAG, exc.getMessage());
                    observer.onError(exc);
                }
            }
    });
}

每次调用List<Country>时,都会返回signalUpdate()。为了确保您在第一次订阅时获得价值,我们会调用startWith(),它将立即发出给定值并启动第一次加载数据。