位图 decodeStream OutOfMemory 异常 [英] Bitmap decodeStream OutOfMemory Exception
问题描述
我在我的应用程序中为 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屋!