译者:我在一个刚刚组建的Android项目组, OutOfMemory困扰了我很久,偶然在Stack Overflow看到有人推荐,阅读了这篇文章。此文技术并不算高端,而且目前已经有一些开源组件可以解决这种问题,但本文从原理出发全面地讲述了类似问题应该怎样处理,使我得到了不少启示。本人水平有限,翻译过程中也是一直在查单词,翻译不到位的地方还请见谅。
学习怎样处理在Android中加载图片不仅可以帮助您创建响应式的UI,而且可以避免超出应用程序的内存限制,从而避免导致OutOfMemory的异常。如果不够谨慎的话,加载Bitmap对象会很快的消耗掉应用程序的可用内存,导致程序崩溃:java.lang.OutofMemoryError: bitmap size exceeds VM budget.
1.移动设备通常拥有很有限的系统资源。Android设备的每一个应用程序可以得到最少16MB的可用内存。安卓兼容性解释文档Android Compatibility Definition Document (CDD)3.7节:虚拟机兼容性根据屏幕尺寸和分辨率为应用程序提供了不同的最小可用内存。应用程序应该被尽量充分地利用,保证不超过最小内存的限制。需要注意的是,许多设备被设置了更大的内存限制。
2.Bitamp对象会占用很多的内存,尤其是对具有丰富图片或者照片的应用来说,内存消耗尤为严重。举例来说,Galaxy Nexus的照相机(500万像素)最大可以照出来一张2592x1936像素的照片,如果这张照片的色彩模式使用ARGB_8888 (Android2.3以后默认使用该模式),那么加载这张照片会占用约19MB的内存空间,在某些设备上,这样做会立刻耗光可用的内存资源。
3.安卓应用程序通常会在同一时刻频繁地请求若干张图片。像ListView,GridView和ViewPager这些组件,一般都会在屏幕上同时显示几张图片,在屏幕显示不到的地方还会有些图片等待着显示。
高效的加载图片:讲述怎样保证不超出应用程序内存限制而加载很大的图片。
在UI线程以外处理图片:图片操作(重新设置尺寸,从远程下载等等)永远不要占用UI线程。这里介绍怎样在后台线程使用AsyncTask处理图片,并且解释怎样处理并发问题。
缓存图片:这一节讲述怎样使用内存和外存缓存图片,在加载众多图片时提升UI的响应程度和流动性。
管理图片内存:这节阐述怎样管理图片内存来使应用程序的性能达到最佳。
在UI中显示图片:这一节将前文综合起来,向您展示,怎样使用后台线程和图片缓存把图片加载到像ViewPager或者GridView这种组件中。
点击这里下载示例源码
原文链接