1

我正在编写一个应用程序,它接收从 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 
    }
}

有什么见解吗?

谢谢。

4

3 回答 3

2

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

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

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

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

于 2016-04-18T08:51:44.590 回答
0

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

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

在您的可观察课程中,总线必须由

可观察类

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);
   }
于 2015-11-25T21:36:33.640 回答
0

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

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

在绿色机器人接收器

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

您可以使用在 Rx 中实现的 EventBus 而不是 GreenRobot:
这里是 Rx 的作者的示例 - gist

于 2015-11-26T13:31:22.810 回答