我对 Android 开发相当陌生,我似乎无法掌握 Java Out of Memory 异常。我知道这意味着我的应用程序已经超出了虚拟机预算,但是在谷歌搜索了很多次之后,我似乎仍然没有掌握这个概念。我担心我的应用程序使用了太多内存,因为我每个屏幕有六个按钮选择器,每个选择器有两个位图,根据属性选项卡,每个选择器大约 20 kb。在我的根 G2x 上,我将 VM 预算设置为 12mb,重新启动手机并运行我的应用程序,没有任何问题。我在每个 onDestroy() 上取消绑定可绘制对象,并暗示 GC 也在这里运行。在模拟器中使用该应用程序一段时间后,我在 DDMS 屏幕上单击“Cause GC”,结果为 ID=1,堆大小 6.133 MB,已分配 2.895MB,空闲 3.238 MB,使用百分比 47.20,# Objects 52,623。
这是我不明白发生了什么的地方,我的模拟器设置为 24MB 的 VM。那个号码在哪里?我遇到的实际问题是,如果我将模拟器设置为 16MB 的 VM,我的应用程序在第二个活动中崩溃并出现内存不足异常。为什么它不会在我的 VM 设置为 12 MB 的手机上或在我的旧 HTC Magic 手机上与 12 MB 的 VM 库存上崩溃?另外,我的应用程序是否占用了太多内存?我不知道那些 DDMS 数字是否好。
至于我的代码,我在 XML 布局中指定了每个图像。除了向它们添加侦听器之外,我不会以编程方式对它们做任何事情。我在这里找到了这段代码,并将其添加到我拥有的每个活动中......
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
否则我所做的就是添加onClickListeners
到具有 PNG 背景的按钮。我想学习如何以编程方式指定按钮背景,但我需要选择器功能,如焦点、按下、非焦点但按下等,以使按钮背景根据用户交互而变化。我已经查看了有关此的文档,但它似乎势不可挡,这就是为什么我认为我将从管理堆的基础知识开始,然后逐步在代码中指定选择器。这可能没有意义,但是应用程序是否可以分配“健康”的内存分配量而不会接近内存不足异常?例如,如果一个应用程序分配了 6MB 应该没问题,但 8MB 会推送它,内存分配是否有这样的界限?