死亡监视器中的内存泄漏使用LeakCanary

4

我使用LeakCanary,不幸出现了一个内存泄漏,以下是logcat日志:

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

你们有人看到过这样的泄漏吗?有什么想法?这个泄漏是在以下情况之后出现的:

  • 更改资源配置以切换语言
  • 完成活动
  • 重新启动活动

你能解决这个问题吗? - Guy B.
嗨,我已经回答了这个问题。希望如果你有同样的问题,这可以帮到你。 - Ligol
1个回答

2

在查找一些坏内存搜索后,我找到了解决此内存泄漏的方法。问题是由于某些可绘制对象未正确从视图中分离并在其他对象上保留指针,因此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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接