我使用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);
}
}
});
}
答案 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()
,它将立即发出给定值并启动第一次加载数据。