使用安卓LiveData https://developer.android.com/reference/android/arch/lifecycle/LiveData.html我希望能够取消注册并注册许多BroadcastReceiver
是在onInactive()
and onActive()
回电。所以我想做这样的事情:
public class BroadcastRecieverLiveData extends LiveData<BroadCastReciever> {
private BroadcastReciever reciever;
private Context context;
public BroadcastRecieverLiveData(Context context) {
this.context = context;
}
@Override
protected void onActive() {
IntentFilter filter = new IntentFilter();
filter.addAction("SOME_ACTION");
filter.addAction("SOME_OTHER_ACTION");
reciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//do something based on the intent's action
}
};
registerReceiver(reciever, filter);
}
@Override
protected void onInactive() {
if (reciever != null) {
context.unregisterReceiver(reciever);
}
}
}
我认为这可能是一种清理代码而不是依赖的设计模式onDestroy
。您对于以这种方式使用 LiveData 有什么想法?有一个使用它的例子here https://developer.android.com/topic/libraries/architecture/livedata.html
我认为对于接收者来说,你应该实施LifecycleObserver
。
按照LiveData
来自谷歌的文档codelab https://codelabs.developers.google.com/codelabs/android-lifecycles/index.html?index=..%2F..%2Findex#0,
注意:在 ViewModel 中存储对 Context 或 View 的引用可以
导致内存泄漏。避免引用实例的字段
上下文或视图类。 onCleared() 方法很有用
取消订阅或清除对其他较长对象的引用
生命周期,但不适用于清除对 Context 或 View 对象的引用。
因此,您不应该在 LiveData 中进行上下文密集型操作。
相反,以下面的实现为例,
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class ReceiverManager implements LifecycleObserver {
private final Context mContext;
private final MyBrodacastReceiver myBrodacastReceiver;
public ReceiverManager(LifecycleOwner lifecycleOwner,
Context context) {
mContext = context;
myBrodacastReceiver = new MyBrodacastReceiver();
lifecycleOwner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void registerYourReceiver() {
mContext.registerReceiver(myBrodacastReceiver, new IntentFilter());
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void unRegisterYourReceiver() {
mContext.unregisterReceiver(myBrodacastReceiver);
}
private static class MyBrodacastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
}
Thanks.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)