2012-08-09 3 views
0

Facebook 및 Gatlk와 연결하고 연락처 및 VCard를 ASMACK API를 사용하여 ListView에 표시하는 채팅 응용 프로그램을 개발 중입니다.Android OutOfMemory 이미지 바이트 배열을 Drawable으로 변환

BYTE ARRAY에있는 VCard의 연락처 이미지를 가져 오는 중입니다. 이 바이트 배열을 이미지 (Bitmap 또는 Drawable)로 변환해야하지만 이미지 바이트 배열에서 Drawable을 만드는 동안 OutOfMemory 예외가 발생하고 ListView가 스크롤되는 동안 발생합니다.

다음은 코드 조각이지만 Bitmap으로 변환하여 시도했지만 Bitmap 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 

날 비트 맵 또는 그리기에이 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;        
} 

당신이

+0

10k 바이트는 그리 크지 않습니다. 아마 당신의 응용 프로그램은 다른 곳에서 많은 메모리를 사용하고 있습니다. 그래서 10k 어레이에서 작동 할만큼 충분한 메모리가없는 이유는 무엇입니까? – ab11

+0

로그인 성공 후 바로 사용자의 아바타를'SDCard'로 설정하거나'Contacts app'와 같이 DB에 저장하고 AsyncTask를 사용하여 listview에로드해야합니다. 내가 그랬어 내 애플 리케이션 꽤 괜찮습니다 –

+0

아바타 바이트 배열 나는 DB에 저장됩니다. 이제 바이트 배열로 압축을 적용했지만 이미지가 왜곡 된 것처럼 보였습니다. 때때로 OutOfMemory가 나타납니다. – Aparna

답변

관련 문제