【问题标题】:Adapter leaks memory?适配器泄漏内存?
【发布时间】:2016-04-21 22:43:04
【问题描述】:

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

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 总是会被调用,但 detach 方法永远不会,所以即使在关闭 Activity 之后适配器也会泄漏大量内存。(运行仅在设置应用程序中可见)

我该怎么办?

【问题讨论】:

  • 为了安全起见,您可以在 Activity 中注册接收器。您真的不应该在任何地方都持有 Activity 引用。

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


【解决方案1】:

为了安全起见,您可以在 Activity 中注册接收器。您真的不应该在任何地方都持有 Activity 引用...

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

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 个子类。这些是非常大的类,其中大多数都将活动用于很多事情,所以我的代码使用这种方法会有点混乱。我需要从我的回收站视图中“分离适配器”之类的东西。
  • 要修复它,您需要删除 Activity 引用。您可以保留弱引用或尝试将 recyclerView.getContext() 强制转换为 Activity,但您可能只会看到更多异常。解决方案是解耦您的代码。为什么不在 Application 子类中注册接收器?那么你永远不会有这个问题。
  • 这是您要找的吗? stackoverflow.com/questions/29978695/…
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2019-08-12
相关资源
最近更新 更多