1、如果你界面上图片过多时,就完全不在xml里放图片,一律在代码中加载
2、asyncImageLoader做缓存
3、如果拿到图如果不行,对图片进行二次采样
4、使用图片尽量小于150K,在使用前做一下判断,如果大于150k就质量减半,直到小于150k
5、尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,可以先通过BitmapFactory.decodeStream方法,创建出一个bitmap
decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode, 无需再使用java层的createBitmap,从而节省了java层的空间。
6、在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常
7、使用decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
8、压缩图片
InputStream is = this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 2; //width,hight设为原来的二分之一
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
9、内存回收
if(!bmp.isRecycle() ){
bmp.recycle(); //回收图片所占的内存
system.gc(); //提醒系统及时回收
}
10、减小资源图片大小公共方法
public static Bitmap readBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
11、通过uri获取图片
private Bitmap readBitMap(Uri uri){
ContentResolver resolver = getContentResolver();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inPurgeable = true;
options.inInputShareable = true;
options.inSampleSize = 2;
InputStream is = null;
try {
is = resolver.openInputStream(uri);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return BitmapFactory.decodeStream(is, null, options);
}
12、通过路径获取图片
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一
Bitmap b = BitmapFactory.decodeFile(fileName, options);
参考文章:
http://blog.sina.com.cn/s/blog_9d448a7501017pxd.html