我对Android开发相当陌生,似乎无法掌握Java内存异常。我知道这意味着我的应用程序已经超出了虚拟机的预算,但经过Google多次搜索之后,我似乎仍然无法理解这一概念。恐怕我的应用使用了太多内存,因为每个屏幕有六个按钮选择器,每个选择器有两个位图,根据属性选项卡,每个选择器大约20 kb。在我根深蒂固的G2x上,我将虚拟机预算设置为12MB,重新启动手机并运行我的应用程序,无任何问题。我在每个onDestroy()上解绑定drawables,暗示GC也在这里运行。在模拟器中使用该应用程序一段时间后,我在DDMS屏幕上单击“原因GC”,结果为 ID = 1,堆大小6.133 MB,分配2.895MB,免费3.238 MB,%使用47.20,#对象52,623。Android了解堆大小
这是我不明白发生了什么,我的模拟器设置为24MB的虚拟机。那个号码在哪里?我遇到的实际问题是如果我将模拟器设置为16MB的虚拟机,那么我的应用程序会在第二个活动出现内存不足异常时崩溃。为什么它不会在VM设置为12 MB的情况下在我的手机上崩溃,或者在带有12 MB VM的旧HTC Magic手机上崩溃?你们也认为我的应用占用了太多的内存吗?我不知道这些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会推动它,在内存分配方面是否有这样的限制?再次感谢亚历克斯洛克伍德您的回应我将阅读并重新阅读它,直到这个东西对我有意义
+1,非常丰富的答案! –
非常感谢!我从中学到了很多东西。我在问题的底部添加了一些信息 –
重新解析评论“20 kb,每个听起来都很好” - AFAIK,*文件大小*无关紧要(对于压缩更好的图像,这将更小),它关乎*尺寸*是什么;在内存中,对于全彩色,每像素需要4B,对吧?因此,根据当前设备的实际所需大小加载它时调整图像的大小非常重要[android docs - 将缩小的版本加载到内存中]。 – ToolmakerSteve