我有这个小实用方法,可以让我获得一个 Observable
来监控蓝牙状态。
public static Observable<Integer> getBluetoothStateObservable(Context context) {
final Context appContext = context.getApplicationContext();
return Observable.create(observer -> {
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int btState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
switch (btState) {
case BluetoothAdapter.ERROR:
observer.onError(new IllegalArgumentException("Error occurred while changing bluetooth state"));
break;
case BluetoothAdapter.STATE_OFF:
case BluetoothAdapter.STATE_ON:
observer.onCompleted();
break;
default:
observer.onNext(btState);
break;
}
}
};
observer.add(Subscriptions.create(() -> appContext.unregisterReceiver(broadcastReceiver)));
appContext.registerReceiver(broadcastReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
})
}
当我在 Activity 中使用此方法时,我知道用户何时启用了蓝牙。这工作正常,但当 Activity 突然被杀死时它会泄漏。
我可以在onDestroy
中取消订阅,但是如何取消注册BroadcastReceiver
?
有什么想法吗?
最佳答案
鉴于 getBluetoothStateObservable 的设置方式,BroadcastReceiver 将在订阅者取消订阅时取消注册。唯一的技巧是确保它确实在 Android Activity 生命周期开始运行时取消订阅。
在这种情况下,您可以保留订阅实例,也可以使用复合订阅。
在 onCreate 或 onStart 中(例如):
mSubscription = getBluetoothStateObservable(this).subscribe();
or
mCompositeSubscription.add(getBluetoothStateObservable(this).subscribe());
在 onDestroy 或 onStop 中:
mSubscription.unsubscribe();
or
mCompositeSubscription.clear();
一如既往,Dan Lew 对 Android 生命周期应如何与 RxJava 协同工作做出了很好的解释 (http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/)
关于android - 销毁 Activity 时在订阅外注销 BroadcastReceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341031/