如何创建RxJava observable以收集服务中的智能手机数据并在活动中订阅?

时间:2016-08-08 21:03:11

标签: android rx-java

上下文:

我正在尝试开发一个Android应用程序来收集来自许多来源的数据,例如:电池,硬件,传感器,手机信号塔,卫星和wifis。

这些数据必须在服务中“观察”,因为我需要它在后台运行才能记录数据并将其发送到我的服务器。当用户打开应用程序时,我还需要在活动中显示该数据。

首先,我使用许多BehaviorSubject单例编写了我的代码,每个单例代表一个数据源。这样我就可以使用onNext方法从服务传递数据并在任何地方订阅它。但现在我想摆脱Subject个对象,因为建议使用Observable

问题:

我有两个问题:

问题1:如何创建在第一个订阅时注册侦听器或Observable的RxJava BroadcastReceiver,并且当所有订阅者调用unsubscribe方法时,它会取消注册侦听器或接收机?

我有这段代码来收听卫星:

private final GpsStatus.Listener gpsListener = new GpsStatus.Listener() {

    GpsStatus gpsStatus = null;

    @Override
    public void onGpsStatusChanged(int event) {
        gpsStatus = locationManager.getGpsStatus(gpsStatus);

        if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
            if (gpsStatus != null) {
                //put satellite data in some list
            }
        }
    }
};

public registerSatellite() {
    locationManager.addGpsStatusListener(gpsListener);
}

public void unregisterSatellite() {
    locationManager.removeGpsStatusListener(gpsListener);
}

我也有这段代码来收听电池信息:

private BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //put intent data in some variable
    }
};

public registerBattery()
{
    context.registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}

public unregisterBattery()
{
    context.unregisterReceiver(batteryReceiver);
}

问题2:为了将数据从服务传递到活动,单身人士是一个不错的选择吗?

1 个答案:

答案 0 :(得分:1)

您可以使用RxJava的PublishSubject。它向订户发送所有后续观察到的项目并支持多个订户:

PublishSubject<GpsStatus> subject = PublishSubject.create();
// observer1 will receive all onNext events
subject.subscribe(observer1);
subject.onNext(<GpsStatus#1>);
subject.onNext(<GpsStatus#2>);
// observer2 will only receive GpsStatus #3
subject.subscribe(observer2);
subject.onNext(<GpsStatus#3>);

结合单身人士,您可以创建一种允许生成器(例如您的GpsListenerBroadcastReceiver)发布到活动的总线。

请不要忘记取消订阅onDestroy(),否则您将泄露活动!