RxJava и 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));
   }
}

И я хочу прослушать такое событие как часть моего наблюдаемого объекта, подобного этому.

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 
    }
}

Любые идеи?

Спасибо.


person Arnaldo Ignacio Gaspar Véjar    schedule 25.11.2015    source источник


Ответы (3)


Технически да, наблюдаемый должен зарегистрироваться в EventBus, поэтому он никогда не получает ReceiverEvent. Но регистрация анонимного класса в шине событий в лучшем случае запутана. Большая проблема связана с вашей архитектурой.

RxJava, EventBus и Observable — все это инструменты, решающие одну и ту же проблему. Все они реализуют более или менее один и тот же трюк — наблюдаемый паттерн. Разница в том, что EventBus и RxJava предоставляют больше возможностей — в основном для элегантности кода — они делают код более читабельным и, следовательно, быстрее реализуемым.

Так что в вашем случае я бы предложил выбрать что-то одно — RxJava или EventBus. Нет необходимости использовать оба.

На данный момент похоже, что вы используете Receiver для прослушивания чего-то в коде C++, а затем используете EventBus для передачи этого сообщения в Observable RxJava, который затем передает его тому, что наблюдает. Почему бы не исключить одного или нескольких посредников? Сделайте Receiver классом Observable или вообще удалите наблюдаемое и просто слушайте ReceivedEvent, в котором когда-либо часть вашего приложения действительно нуждается в этом...

person shredder    schedule 18.04.2016
comment
Да, сохранение обоих подходов не является подходящим способом сделать это. Я абсолютно согласен иметь класс Observable, который обрабатывает такое поведение. - person Arnaldo Ignacio Gaspar Véjar; 18.04.2016

см. это руководство: 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);
   }
person ralf htp    schedule 25.11.2015

Вы можете использовать PublishSubject. Он наблюдаемый и наблюдатель одновременно. Вы можете отправлять события и подписываться на них одновременно.

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

В зеленом роботе-приемнике

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

Вы можете использовать EventBus, реализованный в Rx, вместо GreenRobot:
Вот пример от автора Rx - суть

person zella    schedule 26.11.2015