繁体   English   中英

Android OutOfMemory将图像字节数组转换为Drawable

[英]Android OutOfMemory converting image byte array into Drawable

我正在开发与Facebook和Gatlk连接的聊天应用程序,使用ASMACK API提取联系人和VCard,并在ListView中显示它们。

从BYTE ARRAY中的VCard获取联系人图像。 我需要将此字节数组转换为图像(位图或Drawable),但是在从图像字节数组创建Drawable以及滚动ListView时出现OutOfMemory异常。

下面是代码片段,也尝试通过将其转换为Bitmap进行尝试,但是使用Bitmap出现内存不足异常的情况更加常见。 尝试使用bitmap.recyle()方法作为论坛上针对此类问题提供的解决方案。 但是使用recycle()多数地方都会出现异常,例如“使用回收的图像”。

这里是LOG:

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;                             
}

谢谢

请参阅此处的文档。 它应该可以帮助您。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM