ListView正在泄漏活动上下文

时间:2017-01-12 21:03:57

标签: android listview memory-leaks leakcanary

以下代码泄露了活动上下文:

这实际上位于onPostExecute中的asyncTask

HashSet

在适配器内部,上下文用于

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

我是否持有对上下文的引用?如果是的话我该怎么发布呢?

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

LeakCanary screen shot

2 个答案:

答案 0 :(得分:1)

编辑: 对于exp:

,您可以尝试将mChatListWeakReference一起打包
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

进行操作

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

答案 1 :(得分:0)

好,所以我发现了问题,但我不明白,所以也许有些人可以评论,解释或回答为什么会这样做。泄漏发生在Chat活动中。要进入聊天活动,我在上一个活动中有一个按钮:

    ChatButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View arg0)
        {
            Intent intent = new Intent(mContext, Chat.class);
            mContext.startActivity(intent);
        }
    });

当我开始活动时,我是从

开始的
mContext.startActivity(intent)

如果我将其更改为

startActivity(intent);

它没有泄漏。

修改

它仍然泄漏