2012-10-18 36 views
1

我知道有很多問題,有關Android在不同情況下的OOM論壇,但我找不到一個完整的解決方案。OutOfMemory動畫在ViewFlipper

我有一個活動,用戶可以在多個動畫之間滾動。由於只有動畫在滾動時纔會移動,並且在開始時它必須移動而沒有用戶交互,因此我使用了內部帶有動畫的ViewFlipper。如下圖所示: enter image description here

問題是,在3.0以上的平板電腦和設備上,在翻轉一些動畫並播放它們後拋出OOM。我試過到現在爲止,爲了解決這個問題:

  1. 我使用BitmapFactory.Options縮小的動畫圖像(我 跟着教程Loading Large Bitmaps Efficiently tutorial)。我沒有從教程中實現的唯一的事情就是緩存。
  2. 由於有許多動畫,這麼多的位圖,我 在時刻(當前視圖中,一個上離開 和右邊的一個)加載只有3動畫,但添加和刪除位圖具有 減慢太多的應用程序。
  3. 我試圖通過手動調用可能幫助的所有內容來使垃圾回收器更快地釋放我的圖像:setCallback(null),setImageDrawable(null),destroy(),destroyDrawingCache()(AdView的最後2個)。我甚至tryed recycle()(位圖),卻引起其他異常

上述變化有一定的改善後,但我還是收到OOM模擬器上的Android 4.x的WVGA854或WVGA800(後較長一段的時間)。但是,即使它沒有超出OOM,內存分析也顯示80%的負載在有問題的設備上開始。另外,由於動畫的刪除和添加,用戶體驗在所有設備上都不好。

我開始認爲更多的是架構/設計問題。 這可能是一個模擬器問題?你現在比DDMS更好的內存分析器嗎?

我會爲任何建議非常感謝,我不知道還有什麼可以嘗試我使用這個:)

+0

你試圖使用System.gc()的? –

+0

謝謝!正如我在下面說的,似乎我們應該儘量避免這個問題(http://stackoverflow.com/questions/3117429/garbage-collector-in-android)顯示。但我會嘗試看看其中的差異。 – Laviniux

回答

2

通常以防止內存不足問題

bmp.recycle(); 
bmp = null; 
System.runFinalization(); 
Runtime.getRuntime().gc(); 
System.gc(); 

我的「M調用它後,我使用的位圖

,如果它仍然沒有工作,也許你應該嘗試在真實設備

+0

謝謝,我試過bmp.recycle,但是我沒有真正幫助(你還需要在同一個活動中加載很多位圖嗎?)。關於System.gc()我讀過,因爲有一個複雜的循環算法,並且手動調用GC,算法變得無用,所以我避免了這樣做,因此我不這麼認爲。 – Laviniux

+1

hmmmm,是的我需要在同一個活動中加載很多位圖,並且system.gc()解決了它,但是如果你不想使用它,也許還有其他一些解決方案像使用碎片一樣嗎? –

+0

Framents似乎是一個非常好的主意,我會嘗試。非常感謝NAYOSO :) – Laviniux