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()),它将进入这个blockif{
但它没有,启动应用程序并测试观察者
,它注意到有一个活动的观察者。有什么帮助吗?谢谢。似乎您在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();
}
}