2012-05-28 47 views
0

我有一個用戶評論,查看我的應用程序中的一堆圖像後,它崩潰(他認爲這是由於內存不足錯誤)。我有以下相關代碼:潛在的內存不足錯誤與多個位圖

int themeID = mNav[mPos]; 
    String icon = getThemeData(DbAdapter.KEY_ICON, themeID); 
    ImageView viewer = (ImageView)findViewById(R.id.viewer); 

    Bitmap bMap = null; 
    try { 
     bMap = getJPG(icon + ".jpg"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    viewer.setImageBitmap(bMap); 

當用戶在圖像之間翻轉時,會得到reran。從here我看到你應該在位圖上調用recycle()。設置圖像後,我是否需要在bMap上調用它?或者在設置下一個之前有什麼辦法可以將它從viwer中拉出來?

根據回收的文檔(如果我在bMap上調用它)看起來我不需要使用它:這是一個高級調用,通常不需要調用,因爲正常的GC進程將釋放這個內存當沒有更多的引用到這個位圖。

回答

0

如果你需要明確地調用recycle()這可能意味着你有內存泄漏。調用它幾乎從來不是一個解決方案。

您是否嘗試檢查您的應用程序是否存在潛在的內存泄漏?

要檢查它你可以例如旋轉你的設備幾次,並檢查垃圾收集器的行爲。幾乎每次旋轉時,您都應該有像GC _...釋放211K,71%免費300K/1024K,外部0K/0K,在您的LogCat中暫停1ms + 1ms。注意這部分的變化:300K/1024K。如果你沒有內存泄漏,第一部分應該增長,然後在幾個GC之後變小。如果你有內存泄漏,它會增長並增長,直到出現OOM錯誤。

Check out我的關於內存泄漏的其他答案。

如果您確定沒有泄漏,並且您正在使用Honeycomb,則可以像這樣增加您的應用可訪問的堆大小:android:largeHeap="true"但只有在處理某些huuuge位圖或視頻時纔會推薦它,so don't overuse it

+0

嘗試了旋轉。根據您的條款,似乎不是內存泄漏。從5000到7000回到5000,然後在旋轉20到30次後反彈。 – easycheese

+0

是的,看起來沒關係。也許它不是OOM錯誤?他怎麼知道它是一個?他有一個FC?也許告訴他複製報告併發送給你(這是一個堆棧跟蹤)?不過,我不確定報告是否出現在所有系統上。 –