您的位置:首页 > 其它

解决一个因Bitmap引起的OOM问题

2016-03-04 10:56 246 查看

解决一个因Bitmap引起的OOM问题

发表于1年前(2014-09-29 23:24) 阅读(105) | 评论(0) 0人收藏此文章, 我要收藏
赞0





摘要 BitmapFactory.decodeStream引起了OutOfMemory. 在decodeStream之前,通过设置options.inJustDecodeBounds = true;让Bitmap实现虚加载。
Bitmap OutOfMemory


BitmapFactory.decodeStream引起了OutOfMemory.
在decodeStream之前,通过设置options.inJustDecodeBounds = true;让Bitmap实现虚加载。

设置options.inJustDecodeBounds = true;让Bitmap实现虚加载。
使用options.outWidth和options.outHeight获取图片宽和高。
再使用ImageLoader.getInstance().displayImage加载图片。

public class PhotoViewFragment extends Fragment {

private PhotoView mGestureImageView;
private Bitmap mBitmap;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View inflateView = inflater.inflate(R.layout.fragment_photo_view_show, container, false);
mGestureImageView = (PhotoView) inflateView.findViewById(R.id.image_turn_show_gestureImageView);
getBundleData();
try {
/*减少内存占用*/
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inJustDecodeBounds = true;//虚加载

FileInputStream fis = new FileInputStream(Environment.getExternalStorageDirectory() + File.separator + "abc.png");
mBitmap = BitmapFactory.decodeStream(fis, null, opt);

int width = opt.outWidth;
int height = opt.outHeight;

if (height / width >= 1.6) {//判断横竖图
mGestureImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
mGestureImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
}

DisplayImageOptions op = new DisplayImageOptions.Builder()
.cacheInMemory(true) // default
.build();
Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + File.separator + "abc.png"));
ImageLoader.getInstance().displayImage(uri.toString(), mGestureImageView, op);
} catch (Exception e) {
Log.e("Fragment", "onCreateView image-view", e);
}
return inflateView;
}

/**
* 重置GestureImageView为原大小
*/
public void resetGestureImageView() {
mGestureImageView.reset();
}

/**
* 获得Bundle
*/
private void getBundleData() {
Bundle bundle = getArguments();
}

@Override
public void onPause() {
super.onPause();
mGestureImageView.reset();
}

@Override
public void onDestroy() {
super.onDestroy();
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
mBitmap = null;
}
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: