栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

我发现开发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()

@Overrideprotected 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()方法以递归方式探索视图树,并:

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407089.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号