zoukankan      html  css  js  c++  java
  • 解决一个因Bitmap引起的OOM问题

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

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

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

    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;
            }
        }
    
    
    }
    
  • 相关阅读:
    实现雨滴的效果
    rainyday.js
    XHTML1.0版本你知道么,跟html5版本有什么区别
    背景图合并用在什么地方最适合,有什么优点
    什么是css hack
    用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性
    块属性标签和行内属性标签及样式优先级
    【Loadrunner】Loadrunner 手动关联技术
    【黑盒测试】测试用例的常用方法
    【Linux】阿里云服务器部署--禅道
  • 原文地址:https://www.cnblogs.com/xiaoxiaoshen/p/5241298.html
Copyright © 2011-2022 走看看