繁体   English   中英

RXJava 2 / RxAndroid 2 vs Observable vs Listener观察来自不同的类

[英]RXJava 2 /RxAndroid 2 vs Observable vs Listener to Observe from different classes

因为我想开始我的新应用程序与一个干净的基地我寻找一个好方法分享不同类别的信息。 举个例子,我想订阅一个可以被不同类使用/共享的接口。

接口/ Observable方式示例:

class SingleTonHolder {
    private static _instance = null;  // and initalize it using a static method.
    private List<MyListener> myListeners new ArrayList<>();
    public SingleTonHolder getInstance(){ return _instance }

    public void registerListener(MyListener listener) { myListeners.add(listener); }
    public void removeListener(MyListener listener) { myListeners.remove(listener); }

    public void doSomethingToTheListener(...) { for(MyListener l : myListeners) l.doSomethingToTheListener(..); }
}

ClassOne extends MyListener {
  public void onCreate() { 
      SingleTonHolder.getInstance().registerListener(this); 
  }
  public vond onDestroy() { 
      SingleTonHolder.getInstance().removeListener(this); 
  }
}

和另一个听取变化的课程。

ClassTwo {
  MyListener listener = null;
  public void onCreate() { 
      listener = new MyListener( () => { .... });
      SingleTonHolder.getInstance().registerListener(listener); 
  }
  public vond onDestroy() { 
      SingleTonHolder.getInstance().removeListener(listener); 
  }
}

这确实有效,看起来像是默认解决方案。 每次另一个Object调用SingleTonHolder.doSomethingToTheListener()时,它会通知所有已注册的侦听器进行更改。

因为我想尝试使用缺少文档的RxJava2和RxAndroid2的相同解决方案,我尝试了以下方式。

Class CallFactory{
    public Obvservable<List<Data>> getDummyData() { return anDummyObservable; }
}

然后我创建了一个Singleton类,它具有修改/ observ客户端订阅的功能。

public Observable<List<Data>> getData() {
    return CallFactory.with(context)
           .getDummyData(...)
           .map(modifyList -> { /** do some processing **/return modifyList;          
    }) 
}

因为每次客户端订阅它“调用”它并且客户端保持连接直到调用onCompleted(),所以它不起作用。

我第一次尝试向所有订阅的客户分享信息,我在我的Singleton类中创建了一个PublishSubject。

private PublishSubject<List<Data>> sharedSubject = PublishSubject.create(); 

现在我让我的客户使用类似的方法订阅主题

public PublishSubject getSharedSubject() { return this.sharedSubject; }

如果我想发送一条应该被所有收听客户端接收的消息,那么我已经创建了类似的东西

public void setNewData(List<Data> data) {
    sharedSubject.onNext(data);
}

我很确定它不是应该的样子,但rxjava是否设计用于提供这样的解决方案? 如果我想分享不同于onNext,onError,onComplete的事件,我是否需要在onNext中包装一个接口?

代码没有经过测试,只是为了表明我是如何理解它的。 任何帮助将是欣赏。

是的,RxJava在onNext<T> onComplete()onError()使用了这3个基本的抽象回调。

但是我认为你错过的重要部分是,观察者和消费者是界面的通用抽象。 这意味着你只有3个回调,但你将有3个回调数据类型。

RxJava的主要思想是创建数据流。 这意味着您将拥有PublishSubject<List<Data>>PublishSubject<Foo>PublishSubject<Bar>等等。然后使用Observer<T>Consumer<T>这两个接口中的一个。 无需创建另一个界面或将其包装在其他界面中。 只需使用RxJava提供的那些,并将所需的所有信息都放在数据中。

我希望它有所帮助。

例:

// first class
public static class Foo implements Consumer<Data> {
   Disposable d; 
   public Foo() {
      this.d = SingleTonClass.subject.subscribe(this);
   }

   @Override void accept(Data data) {
         .. here the original data
   }

}

// second class
public static class Bar implements Consumer<MappedData> {
   Disposable d; 
   public Foo() {
      this.d = SingleTonClass.subject
          .map( some data transform  )
          .subscribe(this);
   }

   @Override void accept(MappedData data) {
         .. here the data after the map
   }


}



class SingleTonClass {
    public static PublishSubject<Data> subject = PublishSubject.create();

  // then feel free to fire events in the subject:
    public static void onSomethingHappen(){
      subject.onNext(new Data(1));
    }

    public static void onOtherThingHappen(){
      subject.onNext(new Data(2));
    }
}

总而言之,我不会将Rx调用包装到其他内容中,而只需在需要时直接使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM