Rxjava中列表变化时如何通知观察者
How to notify the obsever when list changes in Rxjava
我有 class 三个 class。 Pref、ClassA 和 ClassB。
public class Pref{
public static ArrayList<Pref> prefList;
public static Observable<ArrayList<Pref>> observable;
public static void loadData(){
prefList = getFromDb();
observable = Observable.just(prefList);
}
}
申请运行A 类优先。
public ClassA{
public ClassA(){
initObserver();
setObserver();
}
public void initObserver(){
Pref.loadData();
}
public void setObserver(){
Observer<ArrayList<Pref>> obs = new Observer() {
@Override
public void onSubscribe(Disposable dspsbl) {
System.out.println("Subscribed");
}
@Override
public void onNext(ArrayList<Pref>> t) {
System.out.println("Loading Preference.");
//Need to do some other works here.
}
@Override
public void onError(Throwable thrwbl) {
}
@Override
public void onComplete() {
}
};
Pref.observable.subscribe(obs);
}
}
现在我想从 ClassB 更改列表。
public class ClassB{
private void changeList(){
Pref.prefList = loadDataFromSomeSource();
}
}
当我运行ClassA
时,System.out works
很好。但是当我从 ClassB
更改列表时,什么也没有发生。我的问题是,使用 Rxjava
是正确的方法吗?是为Rxjava
建造的吗?如果我错了,我该如何实现这个功能?我怎么写几个ClassA
像class这样的ClassB::changeList()
运行的时候,我可以在ClassA?
里听
通过设置 Pref.prefList = loadDataFromSomeSource();
,您将一个新的列表实例分配给 Pref.prefList
。这不会以任何方式更新 Pref.observable
,因为它仍然引用旧的 Pref.prefList
实例。
我还认为您不能使用 Observable
通过它发布事件。据我了解你的情况,你需要一个ObservableSource
(见http://reactivex.io/RxJava/javadoc/io/reactivex/ObservableSource.html)。比如PublishSubject
的实现。你可以这样使用它:
PublishSubject<String> source = PublishSubject.create();
source.subscribe(System.out::println);
source.onNext("test 1");
source.onNext("test 2");
source.onNext("test 3");
或者,在您的情况下:在 class Pref
中,您可以使用 public static PublishSubject<ArrayList<Pref>> source = PublishSubject.create();
。加载数据时,您可以使用 onNext
发布新数据,例如 ClassB
:Pref.source.onNext(loadDataFromSomeSource())
我有 class 三个 class。 Pref、ClassA 和 ClassB。
public class Pref{
public static ArrayList<Pref> prefList;
public static Observable<ArrayList<Pref>> observable;
public static void loadData(){
prefList = getFromDb();
observable = Observable.just(prefList);
}
}
申请运行A 类优先。
public ClassA{
public ClassA(){
initObserver();
setObserver();
}
public void initObserver(){
Pref.loadData();
}
public void setObserver(){
Observer<ArrayList<Pref>> obs = new Observer() {
@Override
public void onSubscribe(Disposable dspsbl) {
System.out.println("Subscribed");
}
@Override
public void onNext(ArrayList<Pref>> t) {
System.out.println("Loading Preference.");
//Need to do some other works here.
}
@Override
public void onError(Throwable thrwbl) {
}
@Override
public void onComplete() {
}
};
Pref.observable.subscribe(obs);
}
}
现在我想从 ClassB 更改列表。
public class ClassB{
private void changeList(){
Pref.prefList = loadDataFromSomeSource();
}
}
当我运行ClassA
时,System.out works
很好。但是当我从 ClassB
更改列表时,什么也没有发生。我的问题是,使用 Rxjava
是正确的方法吗?是为Rxjava
建造的吗?如果我错了,我该如何实现这个功能?我怎么写几个ClassA
像class这样的ClassB::changeList()
运行的时候,我可以在ClassA?
通过设置 Pref.prefList = loadDataFromSomeSource();
,您将一个新的列表实例分配给 Pref.prefList
。这不会以任何方式更新 Pref.observable
,因为它仍然引用旧的 Pref.prefList
实例。
我还认为您不能使用 Observable
通过它发布事件。据我了解你的情况,你需要一个ObservableSource
(见http://reactivex.io/RxJava/javadoc/io/reactivex/ObservableSource.html)。比如PublishSubject
的实现。你可以这样使用它:
PublishSubject<String> source = PublishSubject.create();
source.subscribe(System.out::println);
source.onNext("test 1");
source.onNext("test 2");
source.onNext("test 3");
或者,在您的情况下:在 class Pref
中,您可以使用 public static PublishSubject<ArrayList<Pref>> source = PublishSubject.create();
。加载数据时,您可以使用 onNext
发布新数据,例如 ClassB
:Pref.source.onNext(loadDataFromSomeSource())