以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Android 开发入门 』   (http://bbs.xml.org.cn/list.asp?boardid=56)
----  【基础】加载大图片避免内存溢出  (http://bbs.xml.org.cn/dispbbs.asp?boardid=56&rootid=&id=126771)


--  作者:挥戈回日
--  发布时间:7/19/2013 5:31:00 PM

--  【基础】加载大图片避免内存溢出
移动设备通常都限制了系统资源。 Android设备限制单一的应用程序可用的内存为16MB。 Android的兼容性定义文档(CDD),第3.7节。虚拟机的兼容性提供了所需的各种屏幕尺寸和密度最低的应用程序的内存。应优化应用下执行这个最低的内存限制。但是,请记住,许多设备的配置具有较高的限制。
位图占用了大量的内存,尤其是丰富的图像,如照片。例如,Galaxy Nexus的相机拍照2592X1936像素(5百万像素)。如果使用位图的配置是ARGB_8888(从Android2.3开始默认的),那么此图像加载到内存需要大约19MB的内存(2592*1936*4字节),立刻用尽某些设备上的每个应用程序的限制。
Android应用程序UI经常需要一次装入几个位图。通常包括多个组件,如ListView中,GridView和ViewPager位图在屏幕上一次多了很多可能准备关闭屏幕。

读取位图的尺寸和类型
BitmapFactory类提供几种解码方法(decodeByteArray(),decodeFile(),decodeResource(),等等),用于从各种来源创建一个位图。

这些方法试图构建位图分配内存,因此可以很容易导致OutOfMemory例外。
你可以通过BitmapFactory.Options类指定解码选项。设置属性设置为true inJustDecodeBounds,解码时避免内存分配,则返回null位图对象,但的设置outWidth,的outHeight outMimeType。

这种技术允许你先读取的图像数据的尺寸和类型。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

为了避免例外java.lang.OutOfMemory,位图解码之前检查尺寸。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms