2013-01-14 32 views
2

可能重複:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget - AndroidVM不會讓我們分配**字節

我的應用程序想要分配2529792個字節,我和128MB RAM的設備運行它,它的工作原理罰款,然後我在HTC運行IR的RAM的空閒內存292mb,它給錯誤

01-14 21:08:27.972:E/GraphicsJNI(26585):VM不會讓我們分配2529792字節

,這裏是我的logcat輸出

01-14 21:08:27.391: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process. 
01-14 21:08:27.411: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=14425KB, Bitmap Size=14641KB, Limit=32768KB 
01-14 21:08:27.411: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=668KB 
01-14 21:08:27.512: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes 
01-14 21:08:27.512: D/dalvikvm(26585): GC_FOR_MALLOC freed 905K, 24% free 13520K/17735K, external 14641K/16689K, paused 93ms 
01-14 21:08:27.652: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 3K, 24% free 13552K/17735K, external 14641K/16689K, paused 116ms 
01-14 21:08:27.662: D/skia(26585): --- decoder->decode returned false 
01-14 21:08:27.792: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 13K, 24% free 13655K/17735K, external 14641K/16689K, paused 109ms 
01-14 21:08:27.872: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process. 
01-14 21:08:27.872: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=13655KB, Bitmap Size=14641KB, Limit=32768KB 
01-14 21:08:27.872: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=1408KB 
01-14 21:08:27.972: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes 
01-14 21:08:27.972: D/dalvikvm(26585): GC_FOR_MALLOC freed 39K, 24% free 13615K/17735K, external 14641K/16689K, paused 96ms 
01-14 21:08:28.092: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 40K, 24% free 13579K/17735K, external 14641K/16689K, paused 102ms 
01-14 21:08:28.212: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 41K, 24% free 13574K/17735K, external 14641K/16689K, paused 103ms 
01-14 21:08:28.212: W/dalvikvm(26585): threadid=17: thread exiting with uncaught exception (group=0x4001d5a0) 
01-14 21:08:28.252: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process. 
01-14 21:08:28.252: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=13585KB, Bitmap Size=13902KB, Limit=32768KB 
01-14 21:08:28.252: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=1468KB 
01-14 21:08:28.352: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes 

任何人可以幫助我嗎?謝謝

回答

2

您是否嘗試過Manifest.xml中的android:largeHeap="true"?我也能看到你正在處理位圖,使用BitMapOptions這樣的方法:

private Bitmap getBitmap(String path) { 

Uri uri = getImageUri(path); 
InputStream in = null; 
try { 
    final int IMAGE_MAX_SIZE = 1200000; // 1.2MP 
    in = mContentResolver.openInputStream(uri); 

    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(in, null, o); 
    in.close(); 



    int scale = 1; 
    while ((o.outWidth * o.outHeight) * (1/Math.pow(scale, 2)) > 
      IMAGE_MAX_SIZE) { 
     scale++; 
    } 
    Log.d(TAG, "scale = " + scale + ", orig-width: " + o.outWidth + ", 
     orig-height: " + o.outHeight); 

    Bitmap b = null; 
    in = mContentResolver.openInputStream(uri); 
    if (scale > 1) { 
     scale--; 
     // scale to max possible inSampleSize that still yields an image 
     // larger than target 
     o = new BitmapFactory.Options(); 
     o.inSampleSize = scale; 
     b = BitmapFactory.decodeStream(in, null, o); 

     // resize to desired dimensions 
     int height = b.getHeight(); 
     int width = b.getWidth(); 
     Log.d(TAG, "1th scale operation dimenions - width: " + width + ", 
      height: " + height); 

     double y = Math.sqrt(IMAGE_MAX_SIZE 
       /(((double) width)/height)); 
     double x = (y/height) * width; 

     Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, 
      (int) y, true); 
     b.recycle(); 
     b = scaledBitmap; 

     System.gc(); 
    } else { 
     b = BitmapFactory.decodeStream(in); 
    } 
    in.close(); 

    Log.d(TAG, "bitmap size - width: " +b.getWidth() + ", height: " + 
     b.getHeight()); 
    return b; 
} catch (IOException e) { 
    Log.e(TAG, e.getMessage(),e); 
    return null; 
} 

來源:Android: Resize a large bitmap file to scaled output file

+0

非常感謝你,但我沒有使用任何位圖,而HTC更強大比第一個。我認爲有一些選擇或類似的東西,我不知道確切的,我也想分配只有2-3 MB,我不認爲一定有一個Ram內存的問題 –

相關問題