【问题标题】:RXJava 2 /RxAndroid 2 vs Observable vs Listener to Observe from different classesRXJava 2 /RxAndroid 2 vs Observable vs Listener 从不同的类观察
【发布时间】:2017-02-20 20:45:05
【问题描述】:

因为我想以一个干净的基础开始我的新应用程序,所以我正在寻找一种在不同类之间共享信息的好方法。例如,我想订阅一个可由不同类使用/共享的接口。

接口/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; }
}

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

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 中包装一个接口?

这些代码未经测试,只是为了说明我是如何理解它的。任何帮助将不胜感激。

【问题讨论】:

    标签: android listener observable rx-java2


    【解决方案1】:

    是的,RxJava 使用了这 3 个基本的抽象回调 onNext&lt;T&gt; onComplete()onError()

    但我相信你错过的重要部分是,观察者和消费者是接口的通用抽象。这意味着您将只有 3 个回调,但每个数据类型您将有 3 个回调。

    RxJava 的主要思想是创建数据流。这意味着您将拥有PublishSubject&lt;List&lt;Data&gt;&gt;PublishSubject&lt;Foo&gt;PublishSubject&lt;Bar&gt; 等。然后使用Observer&lt;T&gt;Consumer&lt;T&gt; 两个接口之一。无需创建另一个接口或将其包装在其他东西中。只需使用 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 调用包装到其他东西中,而是直接在需要的地方使用它们。

    【讨论】:

    • 谢谢。这只是一个例子 ;-) 我知道它用于将新数据添加到流中并通知订阅者,当然在收到所有数据时调用 onComplete()。由于观察者或消费者是通用的,我可以用我想要的任何数据填充它(甚至是接口(!))。但这不是目标,因为我想围绕不同的类共享数据。由于 PublishSubject 被使用(doc)作为 Observer 和 Observable,这看起来很有希望。我有什么问题吗? ;-)
    • 所以每个想要接收数据的班级都会implement Consumer&lt;List&lt;Data&gt;&gt;,他们都可以观察PublishSubject
    • 听起来不错,谢谢。你可以提供一个样本并编辑你的答案吗?到目前为止,谢谢。
    • 它很难理解 RXJava (2),因为文档很难阅读 (github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0)。 Jack Whartons 的演讲 (youtube.com/watch?v=htIXKI5gOQU) 也没有帮助。所以一个例子会很棒!感谢您的努力!
    • 我的大型项目也正在进行中,该项目深入使用 RxJava2,我真的很喜欢它,但它确实需要一种不同的方式来思考你的代码只是连接 Observables 和 Observers。我添加了一些示例,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多