0

私は Facebook と Gatlk に接続し、ASMACK API を使用して連絡先と VCard をフェッチし、それらを ListView に表示するチャット アプリケーションを開発しています。

BYTE ARRAY にある VCard からコンタクト イメージを取得します。このバイト配列をイメージ(ビットマップまたはドローアブル)に変換する必要がありますが、イメージのバイト配列からドローアブルを作成しているときに OutOfMemory 例外が発生し、ListView をスクロールしているときに例外が発生します。

以下はコードスニペットで、これもビットマップに変換してみましたが、ビットマップではメモリ不足の例外がより頻繁に発生します。このような問題のフォーラムで提供されている解決策として、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 で bytearray を変換する最善の方法を教えてください。コード スニペットは次のとおりです。

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

ありがとうございました

4

1 に答える 1

0

こちらのドキュメントを参照してください。それはあなたを助けるはずです。

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

于 2012-08-09T14:37:47.963 に答える