2011-06-14 112 views
4

我有一個應用程序,使大量使用從SD卡讀入的位圖。我99%肯定我的應用程序永遠不會被銷燬而無需回收這些。它們全部被分配到一個LRU緩存(commons-collections)中,當它們從LRU緩存中清除時,它們將回收它們,並且我將剩下的onDestroy()回收。安卓位圖,回收和堆碎片

儘管如此,我仍然有問題。如果我開始/停止/開始/ ...我的應用程序多次,我總是失去內存錯誤。

我的理論是,它必須做w/android的非壓縮堆。經過幾次運行後,堆足夠分散,因此雖然有足夠的空閒內存,但沒有足夠大的連續塊來加載位圖。無論如何,這就是理論。

我一直通過在onDestroy()(android.os.Process.killProcess())中殺死我的進程來「解決」這個問題。這解決了這個問題,但是引入了它自己的其他問題,因爲我有其他需要完成的線程和服務,並且等待所有這些都很實用。更何況我當然明白,這只是一個非常糟糕的做法。

我已閱讀所有帖子等在這個話題上,我看不到一個很好的解決方案。我使用的是Thumbnails.getThumbnail(),所以我已經使用縮小版本的圖像。對它們進行二次採樣會進一步導致圖像質量很差。

我保留了8個「迷你」縮略圖和36個「微型」縮略圖的緩存,所以我從來沒有比內存更多的一次。這些應該都在幾乎所有適合幾個megs。

任何想法/技巧/指針表示讚賞。我在這個機智的結尾。

回答

2

你說你在onDestroy()回收它們,但也許你應該回收它們在onPause()?我在切換方向時遇到了一些內存不足問題,並通過在onPause()中進行回收來解決問題。

只是一個想法。不知道這是否能解決您的問題。

+0

謝謝,這並沒有解決問題,但它似乎是一個很好的做法。我認爲它會導致仍然引用位圖的其他對象出現問題,這似乎並沒有這樣做。 – 2011-06-14 22:00:35