2011-08-15 16 views
23

已推薦在various places中使用Android的BitmapFactory.Options.inPurgeable作爲避免Android 2.x及更早版本(Android 3.1 fixes this)中的OutOfMemory異常的方法。爲什麼我不使用BitmapFactory的inPurgeable選項?

如果inPurgeable太棒了,爲什麼我不想使用它?如果設置爲true,則生成位圖將分配其像素,使得他們可以在系統需要回收內存中清除

:本documentation似乎在說什麼這個選項是做細節很輕。在這種情況下,當像素需要再次訪問時(例如繪製位圖,調用getPixels()),它們將自動重新解碼。

看起來不錯。有什麼收穫?

回答

9

documentation已更新,其中包含解決原始問題的其他信息。

摘要:不再推薦使用此標誌。

+1

事實上,這個標誌已經(自API 21起)被棄用。 –

1

爲了重新解碼發生,位圖必須能夠訪問編碼數據,或者通過共享對輸入的引用或通過複製它。

如果您無法再訪問編碼數據,那麼這可能是一個問題吧?如果你是從流ByteArray實時解碼位圖,並且你的應用程序只是決定回收內存,那麼會不會導致你的位圖丟失那些像素?

1

此標誌目前完全被忽略,這就是抓住。


更新由@slodge:請人誰是讀這篇文章,把它看作正確的答案也可以參考的意見 - 「這個標誌是目前完全忽略」僅在某些情況下,真正的 - 在其他情況下(如當在下載的數據上使用decodeByteArray時),那麼這個標誌不被忽略,並且非常非常有用

+0

lol,我剛剛登錄回來編輯我的問題,以刪除在看到您的評論時發現「它似乎使我的應用在加載許多圖像時表現更好」的部分。 – emmby

+0

我已經運行了ApiDemo的「PurgeableBitmap」活動,並且它似乎在128或122(取決於設備)的NonPurgeable內存中一直耗盡內存,但可清除在兩者上始終爲200。這表明國旗並未被完全忽略。你可以擴展這一點嗎?謝謝 –

+0

羅曼,「目前」,你的意思是蜂窩+?因爲「外部」內存問題已得到解決? –

4

如果你正在從文件系統讀取你的位圖,使用這個標誌將迫使Android保持打開文件(至少在4.0。 4)能夠重新閱讀它。讀取超過1024個文件後,您將達到打開的文件的限制並獲得「太多打開的文件」錯誤。

您可以通過使用來自已終端終端的lsof命令來查看所有打開的文件,以觀察該行爲。

+0

「來自文件系統」的含義是什麼?你是指相機拍攝的照片,還是從畫廊中選擇的圖像? –

相關問題