【问题标题】:RxJava and GreenRobot EventBusRxJava 和 GreenRobot EventBus
【发布时间】:2015-11-25 21:04:35
【问题描述】:

我正在编写一个应用程序,它接收来自 JNI 对 Java 类中的静态方法的调用。

举例

public class Receiver {
   // method called from C++ in some thread
   private static void receive(int value) {
       EventBus.instance().post(new ReceiverEvent(value));
   }
}

并且我想将此类事件作为我的 Observable 对象的一部分来监听。

Observer.create(new Observable.Subscriber<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        // blocked until onEvent was fired
        return subscriber.onNext("ok");
    }

    public void onEvent(ReceiverEvent receiverEvent) {
        // fire call observable function 
    }
}

有什么见解吗?

谢谢。

【问题讨论】:

    标签: java android rx-java event-bus greenrobot-eventbus


    【解决方案1】:

    从技术上讲,是的,observable 需要向 EventBus 注册自己,这就是它永远不会接收到 ReceiverEvent 的原因。但是用事件总线注册一个匿名类充其量是一团糟。更大的问题在于您的架构。

    RxJava、EventBus 和 Observable 都是解决相同问题的工具。它们都实现了或多或少相同的技巧——可观察模式。不同之处在于 EventBus 和 RxJava 提供了更多的特性——主要是围绕代码的优雅——它们使代码更具可读性,因此实现起来更快。

    所以在你的情况下,我建议选择一个 - RxJava 或 EventBus。没有必要同时使用。

    目前 - 看起来您正在使用 Receiver 来侦听 c++ 代码中的某些内容,然后使用 EventBus 将该消息传递给 RxJava Observable,然后后者将其传递给正在观察的任何对象。为什么不砍掉一个或多个中间商?将 Receiver 设为 Observable 类,或完全移除 observable 并只监听 ReceivedEvent,您的应用程序的任何部分都需要它...

    【讨论】:

    • 是的,保留这两种方法并不合适。我绝对同意有一个 Observable 类来处理这种行为。
    【解决方案2】:

    请参阅本教程:http://code.tutsplus.com/tutorials/quick-tip-how-to-use-the-eventbus-library--cms-22694

    EventBus 是一个singleton,意味着在整个应用程序中只存在一个EventBus 对象。这个对象必须被getDefault()引用

    在你的 observable 类中,总线必须被引用

    可观察类

    private EventBus bus = EventBus.getDefault();
    

    类必须注册到总线

           bus.register(this);
    

    接收器类

    EventBusReceiver 继承自 BroadcastReceiver

    public class ChargingReceiver extends BroadcastReceiver {
    

    那么因为 EventBus 是一个单例,它也被

    引用
    private EventBus bus = EventBus.getDefault(); 
    
    @Override
    public void onReceive(Context context, Intent intent) {
        Event event = null;
    
    
        // Post the event
        bus.post(event);
       }
    

    【讨论】:

      【解决方案3】:

      您可以使用PublishSubject。它同时是可观察的和观察者。 您可以同时推送和订阅事件。

      PublishSubject<ReceiverEvent> channel = PublishSubject.create();
      channel.subscribe(yourObserver);
      

      在绿色机器人接收器中

      public void onEvent(ReceiverEvent receiverEvent) {
          channel.onNext(receiverEvent);
      }
      

      您可以使用 Rx 中实现的 EventBus 代替 GreenRobot:
      这里的例子来自 Rx 的作者 - gist

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多