android - ListView 正在泄漏 Activity 上下文

标签 android listview memory-leaks leakcanary

以下代码泄露了 Activity 上下文:

这实际上在 onPostExecute 的 asyncTask 中

ChatCustomAdapter customAdapter = new ChatCustomAdapter(mContext,   chatData, Typeface.createFromAsset(getAssets(), "font/Helvetica-Bold.ttf"));
mChatList.setAdapter(customAdapter);

在适配器内部上下文用于

inflater = LayoutInflater.from(mContext);

我是否持有对上下文的引用?如果是,我该如何释放它?

LeakCanary 告诉我 ListView (mChatList) 正在泄漏上下文,如果我删除 setAdapter,泄漏就会消失。

LeakCanary screen shot

最佳答案

编辑: 你可以尝试用 WeakReference 包裹你的 mChatList,对于 exp:

class ChatTask extends AsyncTask {
  private WeakReference<ListView> mListRef;

  public ChatTask(ListView chatList) {
    mListRef = new WeakReference<ListView>(chatList);
  }

  public void onPostExecute() {
    ListView chatList = mListRef.get();
    if (chatList != null) {
        Context context = chatList.getContext();
        ChatCustomAdapter customAdapter = new ChatCustomAdapter(context, chatData, 
                Typeface.createFromAsset(context.getAssets(), "font/Helvetica-Bold.ttf"));
        chatList.setAdapter(customAdapter);
    }
  }
}

如果还是不行,你可以试试这个post


我假设您在 ChatCustomAdapter 构造函数中创建了 inflater 并将该 inflater 保留为全局变量,以便稍后在 getView 中使用 方法?
如果是这样,我认为您应该尝试删除变量 inflater 并在 getView 方法内部,通过 LayoutInflater 创建一个本地 inflater。来自(parentView.getContext);
希望对您有所帮助。

关于android - ListView 正在泄漏 Activity 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622946/

相关文章:

android - 如何更改 SectionIndexer 中弹出窗口的颜色?

android - 无法从 adb shell 读取和写入

c++ - 使用 shared_ptr 时内存泄漏

Python:每个对象类型(或源代码行)的内存使用统计

objective-c - 关闭并重新打开窗口会泄漏内存

安卓 : How to simply add categories/Separators/Section header in my list view?

android - 音频-Android

android - ListView 中每个项目的单独首选项?

android - 更新小部件 ListView

algorithm - QML ListView 如何估计其 contentItem 的高度/宽度