2010-05-22 39 views
0

對於任何想知道的人來說,畫廊是http://www.spore.com/sporepediaGiant在線圖片庫 - 我如何避免OutOfMemoryError?

我的應用程序使用Spore API獲取100個最新的創作,然後在GridView中顯示它們。有關創作的文本數據很容易存儲,但圖像存在問題。

就我所知,我可以將圖像保存在Hashtable中,也可以在每次查看時抓住它們。這些都不會起作用 - Hashtable會快速顯示OutOfMemoryError,並且不斷的重新加載會導致服務器承受很多負載,並且會在客戶端造成很大的延遲。

有沒有更好的方法來存儲圖像?

回答

2

首先不要一次獲得100個,沒有辦法在gridview中顯示100個圖像,並使它們成爲一個有用的可見大小。異步檢索圖像並一次獲得一個屏幕或一個半屏幕。我猜你可以在支持文本/用戶界面元素的情況下顯示每個屏幕大小爲6到9的適當尺寸的圖像,你甚至可以根據手機的屏幕尺寸/分辨率選擇顯示多少個屏幕。所以你應該一次獲得9到12張圖片。

其次,我不知道這些圖像是以什麼樣的分辨率進入的,但它聽起來像'大'。如果API支持,它只會收到您的網格視圖的縮略圖版本。如果不是,我可能會做的是:當您從API接收到圖像時,首先創建一個縮小到您的縮略圖所需大小的新圖像,並將其保存在內存中。然後創建一個縮小到「細節」屏幕所需大小的新圖像(如果有的話),並將其緩存到SD卡中,並將其從內存和原始源圖像中釋放出來,這種縮放可能會發生在一個單獨的線程中,以避免影響UI線程的響應。根據使用模式的不同,我可能也會將縮略圖緩存到SD卡,因此釋放它們在onStop/onPause中使用的RAM並將它們重新加載到onStart/onResume會很便宜。 IT也聽起來像你下載一個'前100'或類似的東西。由於我不希望在每個應用程序中使用新的top 100,所以您可以通過將圖像和信息緩存到SD卡並每次程序運行時只下載新條目來節省大量網絡流量。

備選的方法,如:

接收圖像 - >縮放到位細節大小 - >高速緩存細節大小 - gridview的>顯示縮略圖而異步

緩存縮略圖 - >尺度細節大小到位縮略圖大小

會使用更少的內存,因爲內存中只有圖像的一個副本,但會降低gridview的響應速度,因爲圖像在顯示前必須縮放兩次。它可能足夠快,無關緊要,或者您可以通過在後臺生成縮略圖的同時顯示大圖像(內部縮放)來操作網格視圖的技巧,並在網格視圖準備就緒後將其切換爲縮略圖。你只需要嘗試確定它是否足夠快。