首页 > 解决方案 > 如何在 Rxjava 中的列表更改时通知观察者

问题描述

我上三班。Pref、A 类和 B 类。

public class Pref{
     public static ArrayList<Pref> prefList;
     public static Observable<ArrayList<Pref>> observable;

     public static void loadData(){
         prefList = getFromDb();
         observable = Observable.just(prefList);
    }  
}

应用程序首先运行 ClassA。

    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类似的类,以便在ClassB::changeList()运行时,我可以听它ClassA?

标签: javaswingrx-java3

解决方案


通过设置Pref.prefList = loadDataFromSomeSource();,您将一个新的列表实例分配给Pref.prefList. 这不会Pref.observable以任何方式更新,因为这仍然指的是旧Pref.prefList实例。

我也认为您不能使用 anObservable通过它发布事件。据我了解您的情况,您需要一个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,如下所示ClassBPref.source.onNext(loadDataFromSomeSource())


推荐阅读