位图 decodeStream OutOfMemory 异常 [英] Bitmap decodeStream OutOfMemory Exception

查看:26
本文介绍了位图 decodeStream OutOfMemory 异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中为 Android 使用了我自己的 ViewFlow 示例实现.我正在从网络服务下载加密图像,然后将它们保存在 SD 卡上.我正在使用视图流来动态解密图像并显示它们.但问题是,当用户开始太快地更改图像时,它会向我抛出 OutOfMemoryException 并且我发现/测试的所有信息都不适用于我的情况.这是我正在使用的:

I'm using my own implementation of ViewFlow example for Android in my application. I'm downloading encrypted images from web service and than save 'em on SD Card. I'm using viewflow to decrypt images on the fly and show them. But the problem is that when user start changing the images too fast it's throwing me an OutOfMemoryException and all the information that I've found/test doesn't work for my situation. Here is what I'm using :

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.image_item, null);
    }

    try {
        File bufferFile = new File(ids.get(position));
        FileInputStream fis   = new FileInputStream(bufferFile);

        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        SecretKeySpec keySpec = new SecretKeySpec("01234567890abcde".getBytes(), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec("fedcba9876543210".getBytes());
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        CipherInputStream cis = new CipherInputStream(fis, cipher);

        BitmapFactory.Options o = new BitmapFactory.Options();
        final int REQUIRED_SIZE=300*1024;

        //Find the correct scale value. It should be the power of 2.
        int width_tmp= o.outWidth, height_tmp= o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;

        Bitmap ops = BitmapFactory.decodeStream(cis,null,o2);
        ((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);
        cis.close();
        fis.close();

        System.gc();

    } catch (Exception e) {
        e.printStackTrace();
        ((ImageView) convertView.findViewById(R.id.imgView)).setImageResource(R.drawable.image_unavailablee);
    }

    return convertView;
}

它仍然在线上抛出异常:

And it's still throwing me that exception on line :

((ImageView) convertView.findViewById(R.id.imgView)).setImageBitmap(ops);

有这个例外:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=6791KB, Allocated=3861KB, Bitmap Size=26006KB)

有什么想法可以解决这个问题吗?

Any ideas how to fix that?

推荐答案

仅供处理大型位图的任何人参考,有一篇文章展示了如何处理此类问题以避免 OutofMemory 的最佳方法!

Just for reference to anyone who is dealing with large bitmaps there is an article that show how is the best way to deal with this kind of problems to avoid OutofMemory!

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

希望能帮到你!

这篇关于位图 decodeStream OutOfMemory 异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆