RxJava和GreenRobot EventBus

时间:2015-11-25 21:04:36

标签: java android rx-java event-bus greenrobot-eventbus

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

任何见解?

感谢。

3 个答案:

答案 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