【问题标题】:RxJava: How to subscribe to the events of a different classRxJava:如何订阅不同类的事件
【发布时间】:2020-07-25 12:59:20
【问题描述】:

我有一个关于如何在概念上创建 Observer 并将其链接到另一个类的问题:我目前有一个名为 Simulation 的类,它应该创建 TransactionCreated 对象并将它们作为事件发布。另一个名为TransactionReceiver 的类应该是Simulation 类发布的每个事件的观察者,并与它们一起工作。 main 方法包含在Simulation 类中,首先在静态上下文中创建一个事件并发布它,它可以工作。我的问题是我应该如何将TransactionReceiver 连接为观察者,并让它通过在方法中接收这些事件并使用这些接收到的对象来订阅这些事件?我是否需要创建另一个包含 main 方法的类并创建一个 SimulationTransactionReceiver 对象,然后将它们作为 Observable 和 Observer 链接在一起?那会是什么样子? 如果我用几个不同的类扩展该系统,它们是否都必须通过一个连接 Observers 和 Observables 的类连接在一起?

【问题讨论】:

    标签: java observable rx-java rx-java2


    【解决方案1】:

    您的应用应该只有一个main 方法。

    从概念上讲,这应该是您对SimulationTransactionReceiver 进行初始设置的地方,因此也许您可以将其移至单独的类以帮助您想象事情应该如何工作。您可以尝试以下方法:

    class Application {
       private Simulation simulation;
       private TransactionReceiver transactionReceiver;
    
       public Application() {
           simulation = new Simulation(/* params here*/);
           transactionReceiver = new TransactionReceiver(/*params here*/);
       }
    
       public void go() {
           simulation.simulate().subscribe(transactionCreated -> transactionReceiver.doSomething(transactionCreated);
       }
    
       public static final main(String[] args) {
           Application application = new Application();  
           application.go();
       } 
    }
    

    最终当你变得更流利时,你可以考虑添加一个依赖注入框架,比如 Guice 或 Dagger。

    这将帮助您管理需要在整个应用程序中使用的类的依赖关系。

    所以你最终会得到一个更简单的Application - 它只会设置 DI 框架,然后你就可以使用你想要的类。

    更新:

    如果要在两个不同的类之间进行通信,则需要使用方法:

    class Simulation {
        public Observable<TransactionCreated> simulate() {
            // use PublishSubject or whatever 
        }
    }
    

    【讨论】:

    • 谢谢 我已经认为它必须像这样在结构上连接,但我不确定。在这方面唯一的问题是 RxJava 是如何连接到它的,因为就我而言,你不能订阅类。这是我的问题,因为我正在将数据输入到一个方法(模拟中的 createTransaction)中,并且它在该方法中返回一个 Observable。我如何发布它以便接收者得到它?
    • @PWiese 我更新了我的答案 - 你必须为对象编写相互通信的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多