2014-03-28 81 views
0

我有拿一個位圖,兩種顏色並返回一個BitmapDrawable功能:Android的內存溢出的異常處理位圖

// Theme function 
    static public BitmapDrawable pFilter(Bitmap bitmap, int backgroundColor, int foregroundColor) 
{ 

    Bitmap bitmapCopy = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), null, true); 

    int[] pixels = new int[bitmapCopy.getByteCount()]; 

    bitmapCopy.getPixels(pixels, 0, bitmapCopy.getWidth(), 0, 0, bitmapCopy.getWidth(), bitmapCopy.getHeight()); 

    // Call native function 

    bitmapCopy.setPixels(pixels, 0, bitmapCopy.getWidth(), 0, 0, bitmapCopy.getWidth(), bitmapCopy.getHeight()); 

    BitmapDrawable finalDrawable = new BitmapDrawable(Application.getAppContext().getResources(), bitmapCopy); 

    return finalDrawable; 
} 

// Custom Imageview 
public class CustomImageView extends ImageView 
{ 

private BitmapDrawable sourceImage; 

private CustomTheme theme; 

// [...] 

private void refreshImageView() 
{ 

    super.setImageDrawable(theme.pFilter(sourceImage.getBitmap(), theme.backgroundColor, theme.foregroundColor)); 

} 

我的問題是,經過約80調用該函數(10px的* 10px的位圖)我在此行上發現OutOfMemory異常:

int[] pixels = new int[bitmapCopy.getByteCount()]; 

謝謝。

回答

0

錯誤是在我的JNI調用,而不是在安卓

(*env)->ReleaseIntArrayElements(env, pixels, nativePixels, JNI_COMMIT); 

JNI_COMMIT:複製回內容但不釋放elems緩衝區

解決方案是用0代替JNI_COMMIT:

(*env)->ReleaseIntArrayElements(env, pixels, nativePixels, 0); 
0

調用pFilter(??)後;調用bitmap.recycle();在一部開拓創新的位圖

+0

我得到一個錯誤:java.lang.IllegalArgumentExcepti on:無法繪製回收的位圖 –

+0

原始位圖仍然顯示在imageView上嗎?嘗試在調用回收之前用其他東西替換它。 – hepizoj

+0

是的,看看我的代碼:BitmapDrawable finalDrawable = new BitmapDrawable(Application.getAppContext()。getResources(),bitmapCopy); –