我正在尝试开发一个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:为了将数据从服务传递到活动,单身人士是一个不错的选择吗?
答案 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>);
结合单身人士,您可以创建一种允许生成器(例如您的GpsListener
,BroadcastReceiver
)发布到活动的总线。
请不要忘记取消订阅onDestroy()
,否则您将泄露活动!