2013-03-22 66 views
0

我繼承了這段代碼,並試圖弄清楚如何使它更有效率,所以我不必拋出OutOfMemory異常。這是爲writeBitmap和readBitmap。位圖內存不足異常拋出新OutOfMemoryException(e);

/** 
* Reads bitmap from the state file 
*/ 
void readBitmap(Bitmap bitmap) throws OutOfMemoryException { 
    byte[] buffer; 
    try { 
     buffer = new byte[file.length()]; 
    } catch (OutOfMemoryError e) { 
     throw new OutOfMemoryException(e); 
    } 

    try { 
     file.readBytes(buffer, 0, 0, buffer.length); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
    Buffer byteBuffer = ByteBuffer.wrap(buffer); 

    try { 
     bitmap.copyPixelsFromBuffer(byteBuffer); 
    } catch (Exception e) { 

    } 
} 

回答

1

您可以保存壓縮位圖。它會使它不需要中間字節緩衝區。只需調整壓縮格式即可。您也可以使用創建的內存文件的大小進行播放。

public void writeBitmap(Bitmap bitmap, int id) throws OutOfMemoryException { 
     final int bitmapSize = bitmap.getRowBytes() * bitmap.getHeight(); 

     try { 
      file = new MemoryFile("file" + id, bitmapSize); 
      FileOutputStream out = file.getOutputStream() 
      bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 

     size.x = bitmap.getWidth(); 
     size.y = bitmap.getHeight(); 
    } 
+0

但是這是一個狀態文件,而不是當時的實際圖像。 – user1074300 2013-03-24 04:19:34

+0

writeBitmap接受位圖位圖作爲參數。在這一點上它仍然是一張位圖。然後將它放入一個byteBuffer中,然後將其寫入一個文件。我正在取出位圖並將其直接抽入MemoryFile。 – HalR 2013-03-24 04:28:01

+0

對於那些想知道的應該是OutputStream而不是FileOutputStream。 – user1074300 2013-03-24 04:52:30