Configuring RxJava to Send Data to activity from GCMListenerService

Viewed 905

I am trying to send an update to my Activity from my GCMServiceListener so, I am using RxJava/RxAndroid And created a BusClass for handling sending and Observers

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

And in my Application Class I did this to initialize the BusClass

private ClientBus clientBus;

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

In the activity I want to receive the message, I registered a CompositeSubscription and get a reference to my ClientBus class from the Application Class

clientBus = ((MyApplication) getApplicationContext()).getRxBusSingleton();

 @Override
protected void onStart() {
    super.onStart();
    initSubscriptions();
}

@Override
protected void onStop() {
    super.onStop();
    _subscriptions.unsubscribe();
}


void initSubscriptions() {
    _subscriptions = new CompositeSubscription();
    _subscriptions.add(clientBus.toObserverable().subscribe(new Action1<Object>() {
        @Override
        public void call(Object event) {
            Log.e("New Event", "Event Received");
            if (event instanceof MyGcmListenerService.Message) {
                String msg = ((MyGcmListenerService.Message) event).getMessage();
                if (msg.equals("Update Available")) {
                    scheduleArrayList = getSchedules();
                    scheduleAdapter = new ScheduleAdapter(getApplicationContext(), scheduleArrayList, ScheduledUberActivity.this);
                    scheduledList.setAdapter(scheduleAdapter);
                    scheduleAdapter.notifyDataSetChanged();
                } else if (msg.equals("Refresh")) {
                    fetchTrips();
                }
            }
        }
    }));
}

And from the MyGcmListenerService class I did this when I get a new notification

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

What I don't understand is why isn't it working here? I use it to interact between activities and fragments. I closed my application to check if the notification comes in, It'll enter this block if (clientBus.hasObservers()) { but it didn't and starting the app and testing the Observer, it notices there's an active Observer. Any help? Thanks.

1 Answers
Related