2015-05-12 2 views
3

Я использую LeakCanary и, к сожалению, есть утечка, и вот LogCat:Утечка памяти на DeathMonitor с помощью LeakCanary

In com.appturbo.appoftheday2015:2.09.2:222. 
* com.appturbo.appturbo.ui.HomeActivity has leaked: 
* GC ROOT com.android.internal.util.AsyncChannel$DeathMonitor.this$0 
* references com.android.internal.util.AsyncChannel.mSrcContext 
* leaks com.appturbo.appturbo.ui.HomeActivity instance 

* Reference Key: e049c2ed-6784-4850-b794-20fa96c13dcf 
* Device: motorola google Nexus 6 shamu 
* Android Version: 5.1 API: 22 
* Durations: watch=5176ms, gc=228ms, heap dump=4974ms, analysis=29320ms 

ли некоторые из вас уже видели утечку, как это? Есть идеи? Эта утечка появляется после того, как:

  • Изменение конфигурации ресурсов для переключения языка
  • Завершение деятельности
  • Перезапуск на активность
+0

Где вы можете это решить? –

+0

Привет, я отправил ответ на эти вопросы. Надеюсь, это поможет вам, если у вас есть такая же проблема. – Ligol

ответ

1

Порывшись в какой-то плохой поиск памяти. Я нашел решение этой утечки памяти. Проблема состоит в том, что некоторые выталкиваемые некорректно отделены от представления и сохраняют указатель на какой-либо другой объект. Из-за этого GC не может удалить эти объекты, и здесь это наша утечка памяти.

Чтобы решить эту проблему, я использую этот код, чтобы отменить отрисовку.

public static void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 
Смежные вопросы