我正在开发与 Facebook 和 Gatlk 连接的聊天应用程序,使用 ASMACK API 获取联系人和 VCard 并在 ListView 中显示它们。
从 BYTE ARRAY 中的 VCard 获取联系人图像。我需要将此字节数组转换为图像(位图或 Drawable),但是在从图像字节数组创建 Drawable 以及滚动 ListView 时会出现 OutOfMemory 异常。
下面是代码片段,也尝试将其转换为位图,但位图内存不足异常出现的频率更高。尝试使用 bitmap.recyle() 方法作为论坛为此类问题提供的解决方案。但是使用 recycle() 大多数地方都会出现异常,例如“使用回收图像”。
这里如果日志:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
E/dalvikvm-heap(26048): 10000-byte external allocation too large for this process.
E/GraphicsJNI(26048): VM won't let us allocate 10000 bytes
请让我知道在 Bitmap 或 Drawable 中转换字节数组的最佳方法。代码片段在这里:
public static Drawable createDrawableImageFromByteArray(Context context, byte[] imageByteArray){
Drawable drawable = null;
try{
if(imageByteArray != null){
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)55);
int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)55);
if (heightRatio > 1 || widthRatio > 1){
if (heightRatio > widthRatio){
bmpFactoryOptions.inSampleSize = heightRatio;
} else {
bmpFactoryOptions.inSampleSize = widthRatio;
}
}
bmpFactoryOptions.inJustDecodeBounds = false;
bmpFactoryOptions.inPurgeable = true;
bmpFactoryOptions.inInputShareable = true;
drawable = Drawable.createFromResourceStream(context.getResources(), new TypedValue(), new ByteArrayInputStream(imageByteArray), "testimg", bmpFactoryOptions);
}
}catch(OutOfMemoryError e){
Utils.debugLog("****** createBitmaException :: " + e);
}catch(Exception e){
Utils.debugLog("****** createBitmaException :: " + e);
}
return drawable;
}
谢谢