我已经开发了一个Android应用程序,而我正处于电话应用程序开发阶段,一切似乎都正常进行,您想宣告胜利并出货,但是您知道必须存在一些内存和资源泄漏在那里; Android上只有16mb的堆,而且显然很容易在Android应用中泄漏。
我一直在环顾四周,到目前为止,我们只能挖掘有关“ hprof”和“ traceview”的信息,而且都没有得到很多好评。
您遇到或开发了哪些工具或方法,并希望在OS项目中共享这些工具或方法?
我发现开发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()方法以递归方式探索视图树,并:
删除所有背景可绘制对象上的回调 在每个视图组上删除子级