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 发布新数据,例如 ClassBPref.source.onNext(loadDataFromSomeSource())