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,您的应用程序的任何部分都真正需要它...
我正在编写一个应用程序来接收 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,您的应用程序的任何部分都真正需要它...