我正在编写一个应用程序,它接收从JNI到Java类中的静态方法的调用。
以示例
<figcaption>
我想听这样的事件作为我的Observable对象的一部分。
public class Receiver {
// method called from C++ in some thread
private static void receive(int value) {
EventBus.instance().post(new ReceiverEvent(value));
}
}
任何见解?
感谢。
答案 0 :(得分:2)
从技术上讲,是的,observable需要在EventBus中注册,这就是为什么它永远不会收到ReceiverEvent。但是使用事件总线注册一个匿名类充其量是混乱的。更大的问题在于您的架构。
RxJava,EventBus和Observable都是解决同一问题的工具。它们都或多或少地实现了相同的技巧 - 可观察的模式。不同之处在于EventBus和RxJava提供了更多功能 - 主要围绕代码的优点 - 它们使代码更具可读性,因此实现起来更快。
所以在你的情况下,我建议选择一个 - RxJava或EventBus。没有必要同时使用它们。
目前 - 看起来你正在使用Receiver监听c ++代码中的某些内容,然后使用EventBus将该消息传递给RxJava Observable,然后将其传递给观察到的任何内容。为什么不切出一个或多个中间人?使Receiver成为一个Observable类,或者完全删除observable,只需听取你应用中真正需要它的ReceivedEvent ......
答案 1 :(得分:0)
请参阅本教程:http://code.tutsplus.com/tutorials/quick-tip-how-to-use-the-eventbus-library--cms-22694
EventBus是 singleton ,这意味着在整个应用程序中只存在一个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);
}
答案 2 :(得分:0)
您可以使用PublishSubject
。它可以同时观察和观察。
您可以推送事件并同时订阅它。
PublishSubject<ReceiverEvent> channel = PublishSubject.create();
channel.subscribe(yourObserver);
绿色机器人接收器
public void onEvent(ReceiverEvent receiverEvent) {
channel.onNext(receiverEvent);
}
您可以使用在Rx中实现的EventBus而不是GreenRobot:
这里是Rx作者的例子 - gist