RxJava 和 GreenRobot 事件总线

RxJava and GreenRobot EventBus

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

举例

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 
    }
}

有什么见解吗?

谢谢。

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

EventBus 是一个单例,这意味着在整个应用程序中只存在一个EventBus 对象。此对象必须由 getDefault()

引用

在您的 observable class 中,总线必须由

引用

可观察的class

private EventBus bus = EventBus.getDefault();

并且 class 必须注册到总线

       bus.register(this);

接收者class

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);
   }

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

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

绿色机器人接收器

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

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

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

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

所以对于你的情况,我建议选择一个——RxJava 或 EventBus。没有必要同时使用两者。

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