2012-01-19 38 views
1

我面臨的問題是我似乎無法找到根。即使執行回收,位圖和OutOfMemoryError

在我的視圖中,我有一個動態添加客戶視圖的LinearLayout,其中背景是一個ImageView(使用Ignition庫中的RemoteImageView實現,從URL下載圖像並將其顯示在ImageView中)。我試圖爲平板電腦和手機優化這些圖像,因此我將其最大寬度調整爲800像素,同時保留寬高比。

對於活性的樣子的一個示例:具有高達大量的與ImageView的的背景動態添加自定義視圖http://imgur.com/O6eur

它基本上是一個ScrollLayout>的LinearLayout>。

圖像的寬度最大爲800px,因此如果其縱向圖像的高度可能更高。這些絕不是小圖片。

這些圖像在第一次啓動活動時加載正常。但是我應該退出這個活動,並輸入另一個活動,只有這些圖像中的任何一個,我將面對與BitmapFactory.decodeByteArray()

OutOfMemoryError這很奇怪,因爲我實際上在位圖上調用回收,它是實際上在Logcat中顯示我是這樣做的。

在該應用的啓動:繼承人的GC ALLOC:

01-19 13:20:59.430:d/dalvikvm(30793):GC_CONCURRENT釋放< 1K,2% 免費17969K/18311K,暫停1ms + 2ms

所以你可以看到它有大約17969k免費。

在進入活動,則堆增長:

01-19 13:22:26.090:d/dalvikvm(30793):GC_CONCURRENT釋放< 1K,3%的遊離45812K/46983K,暫停2MS + 19ms

現在它使用45812K。

當我退出(I做光潔度()的onPause),I回收來自所有imageviews的位圖和所述存儲器變成這樣:

01-19 13:23:30.150:d/dalvikvm( 30793):GC_EXPLICIT釋放了26999K,60%空閒19170K/46983K,暫停8ms + 20ms

我們下降到19170K。

我應該再次輸入活動,它會崩潰與OutOfMemoryError。現在的事情是,我正在使用最新的手機(三星Galaxy S2)來測試這一點,我希望我的應用能夠使用較小內存的舊手機,而且我相信它不會支持儘可能多的內存,所以我現在有。

我想知道我能做什麼來顯示儘可能多的圖像我儘可能沒有恐懼的OutOfMemoryError?我早些時候認爲使用RemoteImageView會緩存Bitmaps(https://github.com/kaeppler/ignition),但是我錯了,我仍然面臨這個問題。我能做些什麼來防止這種情況發生?謝謝。

回答

0

你必須寫虛擬滾動。您應該在內存中只顯示圖像並處理重新定位窗口小部件的滾動事件並將新圖像加載到內存中。

+1

會做一個listview嗎? – nubela