2015-11-25 3 views
1

Я пишу приложение, которое принимает вызовы от JNI к статическим методам в Java-классе.RxJava и GreenRobot EventBus

К примеру

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

Любые идеи?

Спасибо.

ответ

1

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

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

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

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

+0

Да, придерживайтесь обоих подходов, это не подходит для этого. Я абсолютно согласен иметь класс Observable, который обрабатывает такое поведение. –

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); 
    } 
0

Вы можете использовать PublishSubject. Наблюдатель и наблюдатель одновременно. Вы можете активировать события и подписаться на него одновременно.

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

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

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

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