我对Android开发比较新,但是Java中的内存溢出异常让我困扰已久。我知道这意味着我的应用程序已经超出了VM预算,但是经过多次搜索后,我仍然无法理解这个概念。我担心我的应用程序使用了太多内存,因为每个屏幕都有六个按钮选择器,每个选择器有两个位图,根据属性选项卡,每个位图大约为20 kb。在我的rooted G2x上,我将VM预算设置为12MB,在重新启动手机并运行我的应用程序时没有任何问题。我在每次onDestroy()中取消绑定可绘制对象并提示GC在此处运行。在模拟器中使用应用程序一段时间后,我点击DDMS屏幕上的“Cause GC”按钮,结果如下:ID=1,堆大小6.133 MB,已分配2.895MB,空闲3.238 MB,%使用率47.20,对象数52,623。
这就是我不明白的地方,我的模拟器设置了24MB的VM,这个数字从哪里来?我面临的实际问题是,如果我将模拟器的VM设置为16MB,在第二个活动上我的应用程序就会崩溃并显示内存溢出异常。为什么我设置VM预算为12 MB的手机或12 MB的股票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,则会有一些问题。内存分配是否有类似于此类的界限?