最近在做一个关于应用市场的类似apk,用到的图片比较多,比较容易造成oom,查看了网络很多资料,这里总结下几个方法。
1、这个最简单,也就是后台服务端给的图片尽量小点,这样我们显示的时候占用的内存就会小很多,我内存oom的问题有一部分原因就是因为服务端给的图片太大,而且是显示在电视上的,大屏显示,占用的内存就更多了
2、使用完图片时要回收。Android把占用图片的内存不是放在java层,所以需要我们自己手动去释放内存。当一个bitmap不需要引用时,我们自己recycle它。
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
当然,这样会很容易报错,说引用了被回收的对象,这就需要我们判断好是不是还需要这个bitmap对象了。
3、在使用imageview的时候,在activity销毁时回收此imageview的图片资源。由于我做的是展示app的一些详细信息,里面肯定会有很多的推荐图片,这时用的就是imageview。在ondestroy里面获取此imageview对象,回收此图片资源。
public void releaseImageViewResouce(ImageView imageView) {
if (imageView == null) return;
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
}
}
4、由于是下载网络图片,我是先把图片下载到本地,在从本地读取图片。由于有的图片可能比较大,这样读取所耗的内存也就增大了,我们在读取的时候可以先对图片进行处理,压缩比例或者设置读取的格式,这样可以减少所占用的内存
private Bitmap buildThum(String path) throws FileNotFoundException {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inJustDecodeBounds = true; // 设置了此属性一定要记得将值设置为false
bitmap =BitmapFactory.decodeFile(path,options);
options.inJustDecodeBounds = false;
int be = options.outWidth/394;
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
bitmap = BitmapFactory.decodeFile(path,options);
return bitmap;
}
这个方法是读取图片时对图片进行压缩显示。比如一个imageview的大小只是394*272(这个是我要显示的大小),而图片却比这个大很多,这时就可以用上面的方式读取图片options.inSampleSize是压缩的比例大小,这个根据你自己的需要进行设置
5、使用imageloader开源项目。这个开源项目真的很强大,可以读取网络、本地的图片,其中对图片的缓存做了很好的处理。具体的源码没有去看过,不过用起来很方便,大家可以去试试。
至于还有没有其他方法,暂时还不知道,这里说明的只是我用到的一些处理方式,若有其他更好的方法希望大神能回复下,虚心请教!