RxJava和GreenRobot事件总线

RxJava和GreenRobot事件总线,java,android,rx-java,event-bus,greenrobot-eventbus,Java,Android,Rx Java,Event Bus,Greenrobot Eventbus,我正在编写一个应用程序,它接收来自JNI对Java类中静态方法的调用 以身作则 public class Receiver { // method called from C++ in some thread private static void receive(int value) { EventBus.instance().post(new ReceiverEvent(value)); } } 我想听听这类事件,作为我观察到的物体的一部分,像这样 Obse

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

以身作则

public class Receiver {
   // method called from C++ in some thread
   private static void receive(int value) {
       EventBus.instance().post(new ReceiverEvent(value));
   }
}
我想听听这类事件,作为我观察到的物体的一部分,像这样

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 
    }
}
Observer.create(新的Observable.Subscriber(){
@凌驾
公共无效呼叫(订户参见本教程:

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

在你的可观察类中,总线必须由

可观察类

private EventBus bus = EventBus.getDefault();
这个班级必须注册到公共汽车上

       bus.register(this);
接收器类别

private EventBus bus = EventBus.getDefault();
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);
您可以使用在Rx中实现的EventBus代替GreenRobot:

这里的例子来自Rx-

的作者,从技术上讲,是的,observable需要向EventBus注册自己,这就是为什么它从来没有接收到ReceiverEvent。但向event bus注册匿名类充其量是一件麻烦的事。更大的问题在于您的体系结构

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

因此,在您的情况下,我建议选择一种——RxJava或EventBus,不需要同时使用这两种


目前看来,你正在使用接收器来侦听C++代码中的某些东西,然后使用EnviBUS将该消息传递给RXJava可观察的人,然后将其传递给任何正在观察的事物。为什么不删去一个或多个中间人?使接收者成为可观察的类,或者移除可观察的全部和JU。st倾听应用程序中哪一部分真正需要它的ReceivedEvent…

是的,保持这两种方法都不适合这样做。我绝对同意有一个可观察的类来处理这种行为。