适配器泄漏内存?

时间:2016-01-16 11:15:36

标签: java android memory-leaks adapter android-recyclerview

我有一个适配器,它使用活动上下文来注册和取消注册一个监听器。

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总是被调用,但是分离方法永远不会,所以即使在关闭活动之后,适配器也会泄漏大量内存。(在“设置”应用程序中只能显示运行)

我该怎么做?

1 个答案:

答案 0 :(得分:1)

为安全起见,您可以在活动中注册接收器。你不应该在任何地方坚持活动参考...

如果您真的想从适配器注册接收器,请使用接口。

public interface Registerer {
    void register();
    void unregister();
}

活动:

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

然后您可以从适配器调用接口方法。我并没有真正看到将此填入视图适配器的重点。