当前位置: 首页 > 知识库问答 >
问题:

RxJava2/RxAndroid2 vs Observable vs Listener从不同类观察

查飞星
2023-03-14
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); 
  }
}

由于我想使用RxJava2和RxAndroid2来尝试相同的解决方案,因此我尝试了以下方法。

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

然后ive创建了一个Singleton类,它有一个函数来修改/observ onec客户机订阅。

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

因为每次客户端订阅它时都会“召回”它,并且客户端一直保持连接,直到调用onCompleted()。

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

代码没有经过测试,只是为了显示我是如何理解它的。任何帮助都将不胜感激。

共有1个答案

徐秋月
2023-03-14

是的,RxJava使用了这3个基本的抽象回调onnext oncomplete()onerror()

但我相信您忽略的重要部分是,观察者和使用者是接口的一般抽象。这意味着您将只有3个回调,但每个数据类型将有3个回调。

RxJava的主要思想是创建数据流。这意味着您将拥有publishSubject > publishSubject 等,然后使用两个接口之一observer consumer 。没有必要创建另一个接口或将其包装在其他东西中。只需使用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调用包装成其他东西,而是直接在需要的地方使用它们。

 类似资料:
  • 问题内容: 我一直在寻找新的rx java 2,但我不确定我是否已经明白了这个主意… 我知道我们所拥有的并没有支持。 因此,基于例如,可以说我有有: 在大约128个值之后,这将崩溃,这很明显我消耗的速度比获取项目要慢。 但是,我们有相同的 即使我延迟使用它,它仍然完全不会崩溃。为了工作,可以说我放了一个运算符,崩溃已经消失了,但并不是所有值都被发出。 因此,我目前在脑海中找不到答案的基本问题是,为

  • 问题内容: 据我了解,RxJava2 创建了另一个Observable,它仅包含原始Observable中的一个元素。这 绝不能 丢,因为它是由效果过滤掉一个例外,因为它是发生第二次。 如 以下 代码段所示 输出量 我的问题: 我理解它正确吗? 到底是什么导致了异常。 如何从消费者那里解决呢? 问题答案: 是的,但是因为可观察到的“结束”并不意味着内部运行的代码已停止。为了在这种情况下完全安全,您

  • 我一直在看新的rx java 2,我不太确定我是否理解了< code >背压的概念... 我知道我们有没有支持的和有背压。 因此,基于示例,假设我有与: 这将在大约128个值之后崩溃,很明显,我的消费速度比获取物品要慢。 但是< code>Observable也是如此 这将不会崩溃,即使我把一些消费延迟,它仍然工作。为了使< code >可流动工作,假设我将< code>onBackpressur

  • 我的java程序有多个类,每个类包含一个单独的JFrame。所有三个JFrames都是在我的main类中启动的,并且设置为setVisible(false)所以它们是隐藏的。当单击JPopUpMenu中的按钮时,相应的JFrame被设置为setVisible(true)。在我定义的这些类中: 当我通过右键单击NetBeans中的.java文件并选择run file来分别运行每个类时,外观和感觉会很

  • 我如何在RxJava中创建一个从不同的地方完成的对象(未来),但我想要向某个客户端返回一个可观察的对象?

  • 问题内容: 只是想知道是否可以将一个类中的jTextArea追加到一个单独的类中?我基本上有一个简单的类,该类会不断运行计算,并且我想在自己的类中创建的GUI上查看输出。该程序可以通过System.out.println执行良好,但是我现在想在我的textarea上查看它。在此先感谢您的指导。 已更新-以下代码是我正在运行的代码。问题区域如下(这是一个很大类的方法): 我希望将此输出写入单独的jT