Nis*_*sha 0 layout android widget
我是android的新手,并尝试使用Bitmap和BitmapFactory将SDcard图像放入网格视图中.但它会导致错误:
ERROR/AndroidRuntime(6137): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
ERROR/AndroidRuntime(6137): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
ERROR/AndroidRuntime(6137): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
ERROR/AndroidRuntime(6137): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:271)
Run Code Online (Sandbox Code Playgroud)
好吧,显然这个问题将在第100次得到回答.这是个主意:
首先取决于设备上的Android版本:
如果您使用的是Android 2.x及更低版本(Honeycomb之前的任何版本),则Bitmap实例占用的内存不会反映在Runtime.getRuntime()报告的堆上可用内存量中. xxxMemory()方法.这些实例被放置在堆内的OUTSIDE内存中.如果要跟踪Bitmap实例将使用多少内存,则必须手动将其计算为imageWidth*imageHeight*4.这将为您提供图像在(堆外)内存中所占用的字节数.这种内存消耗以及堆内内存消耗的总和必须低于Android在某个设备上为您的应用程序分配的最大内存,如果不是,您将收到OutOfMemory错误.
Android分配给进程的总内存在很大程度上取决于设备和Android版本.这可以是16到48兆之间的任何地方.在较旧的设备上是16或32.在较新的设备是32或48.这你必须单独检查你想要定位的每个设备.您也可以在运行时执行此操作,并将其用作指南,以了解您可以在内存中放入多少内容(可能您希望在将图像加载到为您的应用分配16 Mb内存的设备上之前对其进行缩减采样)
在Android Honeycomb(版本3.xx)及更高版本上,Bitmap实例将使用堆内存.这样可以更轻松地跟踪加载图像后仍有多少可用内存.此外,对于这些版本的Android,Bitmap实例将自动进行垃圾收集(如果可能).在蜂巢前,你必须亲自打电话
Bitmap.recycle();
释放位图实例占用的内存.
使用BitmapFactory解码图像(并创建位图实例)时,您可以传入选项,例如仅获取图像的宽度和高度,或在解码前对其进行下采样.这可以帮助您在实际将图像放入内存之前评估图像将占用多少内存.查看文档:http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html
如果你觉得很冒险,你可以一起欺骗内存限制,虽然这不适用于所有设备:创建一个OpenglSurfaceView,并在四边形上将图像显示为纹理.为简单起见,您可以使用正交投影(如果您只需要给出2d的外观).这里的诀窍是,您可以将内存中的图像作为位图加载,将其设置为OpenGL纹理并清除该Bitmap实例.实际图像仍然可以从Texture对象中显示,并且这些对象不受每进程内存限制的限制.