2012-10-14 107 views
0

描述背景,因爲我可能只是有一個可怕的方法來解決問題 - 自我學習。內存問題爲應用程序加載圖像

我正在爲android編寫一個應用程序,並測試它默認的AVD,它被設置爲WVGA800,512'設備RAM大小'和240'抽象LCD密度'。

我有一些圖像,我把它們放到drawable-hdpi中。 該文件夾中有458 KB(不是MB)的圖像。 所有圖像均爲PNG格式。

的問題是,當我嘗試加載我最大的圖像(用於背景),它拋出:java.lang.OutOfMemoryError 這是加載圖像調用:

BitmapFactory.decodeResource(status.getResources(), R.drawable.background); 

這等同於我如何加載其餘的圖像(共33個)。

它對我來說是有道理的,它會在最大的圖像上用盡內存,但我的文件夾總大小爲458 KB,所以我不希望用盡設備上的512 MB RAM。

我從來沒有卸載任何圖像,我保持它們加載,並根據需要使用。 我之前寫過一個不同的應用程序,其中我的圖像總大小爲563 KB,總共有82個圖像,而我沒有這個問題(使用相同的AVD)。實際上,之前的應用程序曾經通過翻轉它來製作每個圖像的幾個副本,但仍未耗盡空間。目前的應用程序在初始加載時失敗 - 在很多事情發生之前。

有人能指出我該問題可能是什麼?我怎麼能解決它,或者可能提及我的方法是錯誤的(例如自我教導)

+1

你應當已經閱讀:http://developer.android.com/training/displaying-bitmaps/index.html – mehmetminanc

+0

什麼是你的資產的尺寸是多少? – dumbfingers

回答

1

是的,這是一個很常見的問題。所以在舊版本的android操作系統中,位圖被加載到本機內存中,而不是JVM。垃圾收集過程確實有2個週期。一個清除JVM中的內存,另一個清除本機內存中的內存(對於位圖)。如果你想在舊設備上工作,你將需要要麼回收您的位圖Bitmap.recycle()或致電System.gc()

來處理這種情況有,你可能會擊中了兩個問題:1。 你有其他的位圖是未回收。 2.你真的內存不足,因爲那個單一的圖像太大了。 (確保其他圖像正確回收或gc'd,以便它不會添加到內存佔用)。在這種情況下,你可以做的事情不多。

此外,由於穆罕默德建議,你可以閱讀this

1

記住幾件事情:

  • 你的應用程序有一個內存限制(這取決於Android版)。你沒有得到所有的設備內存。我認爲第一個android版本的內存限制爲16mb。
  • 文件的大小並不代表內存中位圖的大小。例如,一個32位ARGB位圖將採取32*width*height
  • 如果您正在處理大圖像,則先對其進行縮放。計算你需要的尺寸(這可能是你的尺寸ImageView)並加載一個調整大小的位圖副本。如果您計劃支持的所有設備,把所有的資源到xhdpi文件夾,你可以做到這一點使用BitmapFactory.Options
2

我給你我如何管理,以減輕這一問題

  • 一些提示。 !尤其是背景
  • 文件大小=內存大小