小编典典

哪种Android工具和方法最适合发现内存/资源泄漏?

adroid

我已经开发了一个Android应用程序,而我正处于电话应用程序开发阶段,一切似乎都正常进行,您想宣告胜利并出货,但是您知道必须存在一些内存和资源泄漏在那里; Android上只有16mb的堆,而且显然很容易在Android应用中泄漏。

我一直在环顾四周,到目前为止,我们只能挖掘有关“ hprof”和“ traceview”的信息,而且都没有得到很多好评。

您遇到或开发了哪些工具或方法,并希望在OS项目中共享这些工具或方法?


阅读 275

收藏
2020-10-01

共1个答案

小编典典

我发现开发Android应用程序时最常见的错误之一是“ java.lang.OutOfMemoryError:位图大小超出VM预算”错误。我在更改方向后频繁使用许多位图在活动中发现此错误:活动被销毁,再次创建,布局从XML中“膨胀”,消耗了位图可用的VM内存。

垃圾回收器未正确释放先前活动布局上的位图,因为它们已交叉引用其活动。经过多次实验,我发现了一个很好的解决方案。

首先,在XML布局的父视图上设置“ id”属性:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/RootView"
     >
     ...

然后,在Activity的onDestroy()方法上,调用unbindDrawables()方法,将引用传递给父View,然后执行System.gc()

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
}


private 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();
    }
}

此unbindDrawables()方法以递归方式探索视图树,并:

删除所有背景可绘制对象上的回调
在每个视图组上删除子级

2020-10-01