2017-04-24 59 views
1

我有一個屏幕,我必須在屏幕上顯示兩個相似的圖像。這兩個圖像的大小是動態的,但它們覆蓋了大部分屏幕。當我在我的應用程序中導航到此屏幕時,在AndroidStudio的Memory Monitor中看到一個12MB的尖峯,這意味着這兩個圖像都使用了12MB,因爲在該屏幕上沒有其他UI元素,並且這兩個圖像都是相似的,的屏幕空間,我想每個顯示時都會消耗6MB的內存。這兩個圖像的尺寸爲1174 x 1174像素,res目錄中的尺寸爲396KB。如何減少Android中圖像的內存使用量

我嘗試過使用Glide,但是當通過Glide加載這些圖像時,我看到了相同的內存秒殺。如果應用程序試圖佔用比可用內存更多的內存,甚至Glide也無法提供幫助,並且在我的應用程序的其他部分中存在大量圖像使用。所以總會有內存緊縮,並且在顯示這兩個圖像的應用程序中,我會收到很多OutOfMemory異常。

所以我的問題是如何減少這些圖像的內存使用情況?此外,爲什麼圖像在res文件夾中的大小爲396KB時需要6MB內存?

回答

2

我猜你沒有壓縮你的圖像,使用https://github.com/zetbaitsu/Compressor非常好的圖像壓縮。此外,我也猜測你確實使用Glide緩存策略。

但是,滑動會緩存原始的全分辨率圖像以及該圖像的更小版本。例如,如果您請求1000x1000像素的圖像,並且您的ImageView爲500x500像素,則Glide會將這兩個版本的圖像放入緩存中。

  1. DiskCacheStrategy.NONE緩存任何東西,因爲討論
  2. DiskCacheStrategy.SOURCE緩存只有原來的全分辨率圖像。在我們上面的例子是1000×1000像素的一個
  3. DiskCacheStrategy.RESULT只緩存最終圖像,減少 分辨率(也可能轉換)(默認行爲)後
  4. DiskCacheStrategy.ALL緩存圖像
  5. 的所有版本

要回答你的答案,你需要手動跟蹤緩存卷的android.Try迫使垃圾收集,通常情況下,虛擬機執行只有在絕對必要的垃圾收集,因爲它的價格昂貴。但是,在某些情況下強制垃圾收集可能很有​​用。例如,在查找內存泄漏時,如果要確定是否已經成功釋放大對象,則可以比平常更積極地啓動垃圾回收。

希望這對我很有幫助。

+0

這些圖像非常大 – Remario

+0

嘗試使用上述庫它是好的,也嘗試沒有緩存的磁盤策略和跟蹤您的更改 – Remario

+0

如果您的圖像是便攜式網絡圖形(PNG)或JPEG請考慮先使用TInyPng應用壓縮。 – Remario