2011-07-13 141 views
9

我知道有很多關於Android的位圖圖像討論出來的內存,但是我想知道,如果有人可以解釋給我..位圖圖像的內存不足

目前在我的應用我有列出活動圖像縮略圖(低質量),當我點擊圖像時,它會打開一個新的活動來全屏查看圖像。在我的第二個活動類中,我有:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 1; 
bm = BitmapFactory.decodeFile(myImagePath, options); 

然後我把它放到一個ImageView中來顯示它。這工作,並顯示我的形象,以其完整的質量。但是,如果我點擊回來,然後單擊以再次看到該圖像(並重復這6次)..第6次打開圖像(activity2)時,我得到一個內存不足錯誤,說堆大小= 6919KB,分配= 3125KB,位圖大小= 25848KB!

位圖大小如何大?我認爲它可能會一直創建新的實例,所以我決定在第二個活動中放置一個方法,當後退鍵被按下時......在這個方法中,我設置了我的位圖= null,並且還執行了System.gc()清除垃圾回收器,但這並沒有解決問題。我仍然在第6次點擊縮略圖時出現內存不足錯誤,以全分辨率查看圖像

任何人都可以解釋爲什麼?謝謝

+0

這是一個帶alpha通道的大約6百萬像素的位圖。位圖很大。 –

+0

爲什麼位圖大小在25mb上出現內存不足錯誤呢?正如我所說,它將工作5視圖和第六次內存不足 –

+0

你是否在泄漏內存? –

回答

2

inSample大小應該設置,以便圖像縮放到顯示區域的大小(1 =全尺寸),除非有某種原因你認爲你需要圖像的所有位,所以2將= 1/2規模4 1/4比例等

也可以嘗試bm.recycle()當你使用之前,位圖完成= NULL

更新

再看第二個答案what does recycle do除非你已經嘗試過,並沒有奏效。我已經完成了與加載圖片類似的事情,並且永遠不會耗盡內存,這並不能證明它適用於您,但是據我所知,這是最佳實踐。

+0

據我所知bm.recycle();什麼都不做。我瞭解比例尺,是的,我需要我的形象是全面的。我甚至創建了onDestory方法並調用了垃圾收集器,名爲finish();並將我的視圖實例和變量設置爲null..etc,它仍然崩潰 –

+0

因此,您的圖像h/w是<=顯示大小,或者你說你需要操縱位?至於.recylce什麼都不做,這不是文檔所說的 - void recycle() 釋放與此位圖關聯的本機對象,並清除對像素數據的引用。那麼你是否真的嘗試了.recyle()呢? – Idistic

+0

@dronyx看到我以上評論和修改回答 – Idistic

16

從android中可以得到一些很好的信息,詳細解釋它,以及如何解決這個問題here

每個像素是4字節。 6M像素= 24MBs

一張照片可以用完所有的內存。

位圖佔用大量內存,特別是對於像照片這樣的豐富圖像。例如,Galaxy Nexus上的相機拍攝高達2592x1936像素(500萬像素)的照片。如果使用的位圖配置是ARGB_8888(Android 2.3以後的默認設置),則將該圖像加載到內存中需要大約19MB的內存(2592 * 1936 * 4字節),立即耗盡了某些設備上的每應用程序限制。

我再次指出你的這個great link我從另一個SO中發現了一個問題,它有關於如何正確地解決問題的教程。

+0

如何使用畢加索或通用圖像加載程序來處理此問題?我正在使用這些庫,並且仍然很快得到OOM。 –

+0

@SagarPanwala [這可能是有用的](http://stackoverflow.com/questions/30011106/download-image-and-resize-to-avoid-oom-errors-picasso-fit-distorts-image)。還要考慮到你在其他地方使用了太多的內存。 [它可能不是畢加索本身](https://github.com/square/picasso/issues/1153) – Doomsknight

+0

但我在主屏幕上有這個要求,我只是運行應用程序並滾動它,它崩潰。 我有ViewPager與5圖像(寬度和高度=屏幕寬度)作爲ListView項目。 –