2017-01-12 47 views
1

下面的代碼正在泄漏的活動上下文:ListView的泄漏活動上下文

這實際上是一個的AsyncTask內部在適配器內部的上下文被用於

的onPostExecute

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

+0

什麼是「聊天實例」,它是保存上下文的引用的單身?如果是這樣,將會有泄漏。 – WenChao

+0

@WenChao聊天是隻使用適配器顯示列表的活動,所以我推測它正在泄漏聊天活動的上下文 – Rob85

回答

1

編輯: 你可以嘗試用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


我假設你在內部創建了的構造函數並保留inflater作爲全局變量,以便在以後的getView方法中使用?
如果是這樣,我認爲你應該嘗試刪除變量inflatergetView方法,創建一個本地inflaterLayoutInflater.from(parentView.getContext);
希望有所幫助。

+0

我絕對喜歡這個,並認爲它已修復它,但我的泄漏必須是其他地方,因爲它仍然是泄漏我會更新現在的問題與LeakCanary屏幕快照 – Rob85

+0

我已添加屏幕截圖是否對您更有意義? – Rob85

+0

@ Rob85我更新了答案,請檢查它是否有幫助。 – Minhtdh

0

好吧,所以我已經找到了問題,但我不明白,所以也許有些人可以評論和解釋或回答爲什麼它這樣做。該泄漏發生在聊天活動中。去聊天活動我在以前的活動按鈕:

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); 

它不泄漏。

編輯

它仍然泄漏