2013-10-09 146 views
1

我正在嘗試構建從我的應用程序緩存從網絡下載的圖像的最有效方式,幾年前我試圖做到這一點,並找不到一個有效的方法來做到這一點工作,直到我偶然發現了lazylist適配器在這裏找到:Android最佳的緩存圖像方式

Lazy load of images in ListView

這個工作順利,直到Android 4.0的推出,在這一點上裝載10至20幅圖像後的應用程序會崩潰,因爲之前在那裏我可以反對簡單地加載儘可能多的,我沒有任何問題,我後來發現是冰淇淋三明治的結果限制每個應用程序的內存使用量,這並不存在薑餅2.3和低,我最終決定清除緩存每10左右的圖像,以避免崩潰,但用戶體驗不是很好,因爲這樣做和應用程序使用大量的數據,因爲它不斷地重新下載圖像再次,已經看過,我自那以後試圖使用lru緩存,但這似乎並沒有工作,尤其是當我離開應用程序並重新啓動它的圖像都釋放似乎,我需要一個更好的方式做到這一點並且我注意到其他應用程序(例如instagram)似乎已經找到了緩存數百兆圖像的方法,Im始終必須在我的設置中手動清除instagram緩存,因爲它似乎能夠存儲無限大小的緩存看起來從不彈出其內容,有誰知道如何建立這種緩存?

+0

「我後來發現這是冰淇淋三明治對每個應用程序的內存使用量設置了限制的結果,這在Gingerbread 2.3和更低版本中並不存在」 - 是的,它確實存在。 – CommonsWare

+0

如果這是這種情況,爲什麼當我的手機從2.3更新爲40時,突然無法在該緩存中存儲許多圖像? –

+0

我無法知道。你顯然也不這樣做,因爲你似乎沒有打擾過使用DDMS和MAT來確定你的內存問題的根源。但是,您關於內存使用情況的說法不正確。自從Android 1.0以來,Android的堆大小限制已經有了。基於屏幕分辨率和操作系統版本,它們從最初的16MB限制增加。 – CommonsWare

回答

1

您可以嘗試使用https://github.com/nostra13/Android-Universal-Image-Loader 庫。這爲你做了大部分的努力工作。

+0

哇這個圖書館看起來很棒,我會盡量明天當我得到一些時間,如果它的工作,以及我認爲我會嘗試向編寫它的開發人員捐贈一些錢! –

1

我建議的方式是將圖像從網絡存儲到SD卡或其他東西,然後存儲法師所在的URI。在你的列表中只是從uri載入圖像。

如果你的圖片大小大,你也許應該rezise圖像保存它,讓你使用較少的內存,並且由於處理已經完成

BTW內存限制始終存在,將加載速度更快前android

+0

我會嘗試這樣做,但我不知道還有什麼可以解釋爲什麼我的應用程序開始崩潰時操作系統發生變化,在2.3我加載了非常大的圖像,它從來沒有造成問題,在4.0我開始越來越OutOfMemoryError –

+0

你可能會得到錯誤,因爲你沒有適當地縮放你的圖像 – tyczj

+0

之後,我開始縮小圖像小得多,但後來的問題是圖像質量是可怕的,這打敗了應用程序的目的,另一方面instagram能夠加載巨大的圖像和大量的他們,他們仍然在緩存中,無論是什麼 –