以下代码泄露了 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,泄漏就会消失。
最佳答案
编辑:
你可以尝试用 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/