我的做法是时间换空间,尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,可以参考这个开源组件的实现。code.google.com/p/androi…
其将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。
除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件?需要都留在内存中吗?目前我做的应用,每次请求的数据大小都比较小,每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。
经常会OOM我觉得就是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
拿到这个图片的大小,再算好缩放比例
int scale = 0;
scale = (int)(options.outHeight / (float)size);
if (scale <= 0) {
scale = 1;
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
再进行decode。
总之就是尽量时间换空间,实际这个时间是非常非常短的,用户体验内的。