Android 配置RxJava以从GCMListenerService向活动发送数据

Android 配置RxJava以从GCMListenerService向活动发送数据,android,rx-android,Android,Rx Android,我正试图从我的GCMServiceListener向我的活动发送更新,因此,我使用RxJava/RxAndroid并创建了一个BusClass来处理发送和观察者 public class ClientBus { //private final PublishSubject<Object> _bus = PublishSubject.create(); // If multiple threads are going to emit events to this // then i

我正试图从我的
GCMServiceListener
向我的
活动
发送更新,因此,我使用
RxJava/RxAndroid
并创建了一个
BusClass
来处理发送和
观察者

public class ClientBus {

//private final PublishSubject<Object> _bus = PublishSubject.create();

// If multiple threads are going to emit events to this
// then it must be made thread-safe like this instead
private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

public void send(Object o) {
    _bus.onNext(o);
}

public Observable<Object> toObserverable() {
    return _bus;
}

public boolean hasObservers() {
    return _bus.hasObservers();
}
}
在我想要接收消息的活动中,我注册了一个
CompositeSubscription
,并从
应用程序类

private ClientBus clientBus;

public ClientBus getRxBusSingleton() {
    if (clientBus == null) {
        clientBus = new ClientBus();
    }
    return clientBus;
}
clientBus=((MyApplication)getApplicationContext()).getRxBusSingleton()


我不明白的是为什么它不在这里工作?我使用它在活动和片段之间进行交互。我关闭了我的应用程序以检查通知是否进入,如果(clientBus.hasObservators()),它将进入这个block
if{
但它没有,启动应用程序并测试
观察者
,它注意到有一个活动的观察者。有什么帮助吗?谢谢。

似乎您在
CompositeSubscription
MyApplication
中使用了
ClientBus
类的不同实例。 试着从
ClientBus
类中创建一个单例,它对我来说很好

public class ClientBus {

    public ClientBus(SingletonAccessor accessor) {}

    private static ClientBus instance;
    private static class SingletonAccessor{}

    public static ClientBus getInstance() {
        if (instance == null) instance = new ClientBus(new SingletonAccessor());
        return instance;
    }

    private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());

    public void send(Object o) {
        mBus.onNext(o);
    }

    public Observable<Object> toObserverable() {
        return mBus;
    }

    public boolean hasObservers() {
        return mBus.hasObservers();
    }
}
公共类ClientBus{
公共ClientBus(SingletonAccessor访问器){}
私有静态ClientBus实例;
私有静态类SingletonAccessor{}
公共静态ClientBus getInstance(){
如果(instance==null)instance=newclientbus(newsingletonaccessor());
返回实例;
}
private final Subject mBus=new SerializedSubject(PublishSubject.create());
公共无效发送(对象o){
mBus.onNext(o);
}
公共可观察到的到可观察到的(){
返回小微企业单位;
}
公共布尔hasObservators(){
返回mBus.hasObservators();
}
}

就时间而言,您是否在订阅事件总线后发送消息?消息将始终在
订阅后发送,因为我的
GCMListener
类是发送消息的类。而
活动
正在等待
订阅
中注册的信息
onStart
为什么不使用greenbus或otto?因为他们做的事情与RxJava相同。我在我的应用程序中的多个场景中使用了RxJava。如果可以,为什么要将我的应用程序与更多LIB捆绑在一起。我所需要做的只是了解它如何在Pedramb工作,因为重新发明轮子需要你宝贵的时间。otto对我们来说是一个简单而容易的工具e库,它提供了开箱即用的所有线程处理功能,而且它只有约100种方法。您可能对一个工作示例感兴趣,以了解您试图实现的目标:
 private void sendRefreshNotif() {
    if (clientBus.hasObservers()) {<--It enters the if cause the Log prints. But, the activity doesn't get the message
        Log.e("Obervers", "Observers aren't null");
        clientBus.send(new Message("Refresh"));
    }
}
public class ClientBus {

    public ClientBus(SingletonAccessor accessor) {}

    private static ClientBus instance;
    private static class SingletonAccessor{}

    public static ClientBus getInstance() {
        if (instance == null) instance = new ClientBus(new SingletonAccessor());
        return instance;
    }

    private final Subject<Object, Object> mBus = new SerializedSubject<>(PublishSubject.create());

    public void send(Object o) {
        mBus.onNext(o);
    }

    public Observable<Object> toObserverable() {
        return mBus;
    }

    public boolean hasObservers() {
        return mBus.hasObservers();
    }
}