以下代码泄露了活动上下文:
这实际上位于onPostExecute中的asyncTask
HashSet
在适配器内部,上下文用于
ChatCustomAdapter customAdapter = new ChatCustomAdapter(mContext, chatData, Typeface.createFromAsset(getAssets(), "font/Helvetica-Bold.ttf"));
mChatList.setAdapter(customAdapter);
我是否持有对上下文的引用?如果是的话我该怎么发布呢?
LeakCanary告诉我ListView(mChatList)正在泄漏上下文,如果我删除了setAdapter,那么泄漏就已经消失了。
答案 0 :(得分:1)
编辑: 对于exp:
,您可以尝试将mChatList
与WeakReference
一起打包
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
方法中使用?
如果这是真的,我认为你应该尝试删除变量inflater
和getView
内部方法,按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);
它没有泄漏。
修改强>
它仍然泄漏