2017-01-12 10 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

Что такое «Chat экземпляр», это одноэлементно, который содержит ссылку на контекст? Если это так, произойдет утечка. – WenChao

+0

@WenChao Chat - это активность, которая просто отображает список с использованием адаптера, поэтому я предположил, что он протекает в контексте активности чата. – Rob85

ответ

1

EDIT: Вы можете попытаться обернуть 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);
Надежда, что помогает.

+0

Мне определенно понравилось это и подумал, что оно исправлено, но моя утечка должна быть еще там, где она еще утечка, я сейчас обновлю вопрос с помощью экрана LeakCanary, снятого – Rob85

+0

. Я добавил, что экранный снимок имеет для вас больше смысла? – Rob85

+0

@ Rob85 Я обновил ответ, PLS проверить, если это может помочь. – 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); 

не просачивается.

Редактировать

это еще просачиваться