1.使用BitmapFactory的decodeStream方法加载图片,此方法直接调用JNI底层C/C++方法,避免了JAVA层消耗:
private void setImage(int page){
//images[page]为资源ID数组中的资源ID
InputStream is = this.getResources().openRawResource(images[page]);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
//图片大小缩放比例,建议为2的倍数,这里图片尺寸没有缩放
options.inSampleSize = 1;
btp =BitmapFactory.decodeStream(is,null,options);
//将生成的 bitmap设置到目标imageView
iv_specialtyImage.setImageBitmap(btp);
}
亲测可用,不停内存溢出的类也消停了。但是,如果事情要做的绝一点,要加上以下方法:
2.主动释放之前bitmap资源引用并告知GC来回收
其中btp为定义的类成员变量 Bitmap
/**
* 提醒GC回收
*/
private void recycleImage(){
if(!btp.isRecycled()){
btp.recycle();
btp = null;
System.gc(); //提醒系统及时回收
}
}
在图片切换方法中,设置新图片时,释放老图片资源引用:
/**
* 海报翻页
*/
private void pageNext() {
page++;
if(page > (images.length - 1)){
page = 0;
}
//释放
recycleImage();
//设置
setImage(page);
}