原代码是:
HashMap<String, Object> listItemMap = new HashMap<String, Object>();listItemMap.put("ItemImage", R.drawable.image1);listItemMap.put("ItemText", "introduction");this.listItem.add(listItemMap);listItemMap = new HashMap<String, Object>();listItemMap.put("ItemImage", R.drawable.image2);listItemMap.put("ItemText", "weather");this.listItem.add(listItemMap);listItemMap = new HashMap<String, Object>();listItemMap.put("ItemImage", R.drawable.image3);listItemMap.put("ItemText", "gallery");this.listItem.add(listItemMap);listItemMap = new HashMap<String, Object>();listItemMap.put("ItemImage", R.drawable.forward);listItemMap.put("ItemText", "testing");this.listItem.add(listItemMap);this.listView.setAdapter(this.listItemAdapter);
原来意图是在listview的每个item都添加一个imageview,我这里定义的listview只有4个item,但是没有注意到memory的问题,直接从drawable load进来
直接提示:
E/dalvikvm-heap(18508): Out of memory on a 2469776-byte allocation.
其中image1,2,3,4都是1024 * 768 占用内存比较大的图片。每张图片接近1M。
阅读了android的documents:
http://developer.android.com/training/displaying-bitmaps/index.html
里面有提到一些方法,但是因为屏幕上可以显示好多个listview的item,导致可以间接或者直接使用的接口:
decodeByteArray(), decodeFile()
, decodeResource()
, 或者recyle机制等对我这种情况都没用
或许只有我那么奇葩,用那么高分辨率的图片做item的图标,最终决定开大招:
用ps把图片分辨率改了,内存占用自然也少,每张图片只有几k。
或许你有其他好办法?欢迎指正!
注:引起:Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1) exception,OOM不是唯一原因。
这里讨论的是OOM。另外可以使用
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass();
Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));
来查看设备的application heap max value。详细请看:
http://stackoverflow.com/questions/2630158/detect-application-heap-size-in-android/9428660#9428660