2015-02-12 66 views
0

我使用下面的代碼這種方式,但是當我將圖像添加到ArrayList中的某個時候我的應用程序崩潰後,它超出內存錯誤我怎麼可以存儲大量位圖存儲在一個ArrayList中

    ArrayList<Bitmap> rev = new ArrayList<Bitmap>(10000); 
        for (long i = 1000000; i < millis * 1000; i += 1000000) 
        { 

          finalBitmap = retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
          rev.add(finalBitmap); 
          try 
          { 
           ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
           finalBitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes); 
           File f = new File(saveFolder, ("img0"+j+".png")); 
           f.createNewFile(); 
           FileOutputStream fo = new FileOutputStream(f); 
           fo.write(bytes.toByteArray()); 
           fo.flush(); 
           fo.close(); 
           j++; 
          } 
          catch (IOException e) 
          { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         } 
+0

存儲在數組列表位圖必須在一些地方造成問題。我建議只在arrayList中存儲圖像路徑,並使用 – Amsheer 2015-02-12 05:42:39

回答

0

與有限的內存可用,您將無法直接參考每個圖像,否則就像您說會耗盡內存。只要存在對您的BitMap對象的引用,這些圖像就會佔用內存中的空間。爲了釋放這個內存,你需要解引用這些BitMaps和/或清除ArrayList,這將允許垃圾收集器釋放未使用的內存。理想情況下,您只需要參考您可以看到的圖像或您將在下面看到的圖像。

您可以查看每個頁面視圖的8個圖像,或者查看周圍頁面視圖中的圖像。如果您顯示的圖像比它們佔用的尺寸大得多,那麼您可能需要即時調整這些圖像的大小,並且只將它們存儲爲它們出現的大小,這也應該有助於減少圖像的內存佔用。

Android的開發者寫了一系列的教程就剛纔這個話題:http://developer.android.com/training/displaying-bitmaps/index.html

+0

感謝您的答覆,但問題是我必須在另一個活動中使用此ArrayList,我必須處理這些圖像。如果我明確了ArrayList,那麼我如何在其他Activity上使用它們 – 2015-02-12 05:40:40

0

如果需要圖像的住宿傳遞給一個活動,然後你,如果你吃更好發送的文件路徑的住宿吧可以改變活動。

否則,您將需要新建以讀取稍後採樣大小的位圖,以便它們更小但消耗更少的內存。

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

您可以使用4 *寬*高來確定位圖的大小時,它在內存中,用它來確定將多少內存分配。

使用BitmapFactory.Option.inJustDecodeBounds得到位圖的大小,而無需加載它