私はObservable
のBluetooth状態を監視するこの小さなutilメソッドを持っています。アクティビティが破棄されたときにサブスクリプション外のBroadcastReceiverの登録を解除する
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));
})
}
私のアクティビティでこのメソッドを使用すると、ユーザーがいつBluetoothを有効にしたかが分かります。これは正常に動作しますが、アクティビティが突然終了するとリークします。
onDestroy
で登録を解除できますが、BroadcastReceiver
の登録を解除するにはどうすればよいですか?
アイデア?
あなたが作成した観察可能なものはバックプレッシャをサポートしていないので、ダウンストリーム演算子から 'MissingBackpressureException'がトリガされるのを避けるためには、 '.onBackpressureXXX()'でtを指定します。 –