我的应用程序有问题。在陆地空间模式下切换时,调用 setContentView() 方法来显示钢琴键盘。钢琴键盘类扩展了 Surfaceview 以更好地显示按下的键。这个 SurfaceView 类作为子类添加到我的横向布局中:
RelativeLayout rootLayout = (RelativeLayout) findViewById(R.id.rootLayout);
RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
relativeLayoutParams.addRule(RelativeLayout.BELOW, R.id.relativeLayoutLowerBar);
rootLayout.addView(keyboardSurfaceView, relativeLayoutParams);
在我的keyboardSurfaceView 类中,我使用BitmapFactory.decodeResource() 方法将位图加载到位图数组中,并保存位图直到应用程序被销毁。这很好用。当我在纵向模式下切换时,我使用 setContentView() 更改布局并删除 keyboardSurfaceView :
if(keyboardSurfaceView != null && keyboardSurfaceView.getParent() != null)
((ViewGroup) keyboardSurfaceView.getParent()).removeView(keyboardSurfaceView);
位图加载一次。第一次切换横向模式。我遇到了内存不足的错误,当从横向的 protrait 等进行 10-20 次切换时,等等。当我在 ddms 视图中更新堆时,我可以看到,每次当我从横向视图中的 protrait 视图切换时,堆大小都会增长到 ca。20mb 然后应用程序崩溃。我不知道为什么这一直在发生。位图只加载一次,而不是每次。我也试过bitmap.recycle(); bitmap = null
没有成功。还尝试使用 LRUCache 类缓存位图,如 Google 最佳实践中所述。我还搜索了 stackoverflow 以找到适合我的问题的解决方案。仍然无法解决此问题。我自己处理纵向/横向更改(覆盖了 onConfigurationChanged() 方法)。将所有图像放入 drawable-xhdpi 会有所帮助。改变方向时,堆大小和以前一样增长,但仍在增长。任何帮助,将不胜感激...
例外:
02-13 22:44:09.419: E/dalvikvm-heap(935): 11448-byte external allocation too large for this process.
02-13 22:44:09.419: E/dalvikvm(935): Out of memory: Heap Size=16391KB, Allocated=13895KB, Bitmap Size=16394KB, Limit=32768KB
02-13 22:44:09.419: E/dalvikvm(935): Trim info: Footprint=16391KB, Allowed Footprint=16391KB, Trimmed=432KB
02-13 22:44:09.419: E/GraphicsJNI(935): VM won't let us allocate 11448 bytes