Java 适配器泄漏内存?

Java 适配器泄漏内存?,java,android,memory-leaks,adapter,android-recyclerview,Java,Android,Memory Leaks,Adapter,Android Recyclerview,我有一个适配器,它使用活动上下文注册和注销侦听器 Activity mActivity; MyBroadcastReceiver mReceiver; @Override public void onAttachedToRecyclerView (RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); mActivity.registerReceiver(mReceiver, ...)

我有一个适配器,它使用活动上下文注册和注销侦听器

Activity mActivity;
MyBroadcastReceiver mReceiver;

@Override
public void onAttachedToRecyclerView (RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
    mActivity.registerReceiver(mReceiver, ...);
}

@Override
public void onDetachedFromRecyclerView (RecyclerView recyclerView) {
    super.onDetachedFromRecyclerView(recyclerView);
    mActivity.unregisterReceiver(mReceiver);
    mActivity = null;
}
尽管总是调用onAttachedToRecyclerView,但分离方法永远不会调用,因此即使在关闭活动后,适配器也会泄漏大量内存。(只有在设置应用程序中才能看到运行)


我必须做什么?

为了安全起见,您可以在活动中注册接收者。你不应该在任何地方保留活动引用,真的

如果确实要从适配器注册接收器,请使用接口

public interface Registerer {
    void register();
    void unregister();
}
在活动中:

mRecyclerView.setAdapter(new RecyclerAdapter(someDataSet, 
new Registerer() {
    public void register() {
        registerReceiver(mReceiver, ...);
    }
    public void unRegister() {
        unregisterReceiver(mReceiver);
    }
});

然后可以从适配器调用接口方法。不过,我真的不认为把它塞进视图适配器有什么意义

为了安全起见,您可以在活动中注册接收者。你不应该在任何地方保留活动引用,我忘了提到我的适配器是一个抽象类,它大约有10个子类。这些是非常庞大的类,它们中的大多数将活动用于很多事情,因此我的代码使用这种方法会有点混乱。我需要从我的回收器视图中删除类似“分离适配器”的内容。若要修复它,您需要删除活动引用。您可以保留弱引用,或者尝试将recyclerView.getContext()强制转换为活动,但您可能只会看到更多异常。解决方案是将代码解耦。为什么不在应用程序子类中注册接收方?那你就不会有这个问题了。这就是你要找的吗?