2011-06-26 164 views
8

我目前有一個ListView與自定義適配器,它可以異步獲取描述行內容的信息。每行的一部分是一個圖像URL,我打算異步下載並顯示。ListView異步圖像加載策略

我目前的計劃爲戰略,以下載這些圖片是:

  • 保持軟引用的高速緩存下載的位圖對象。
  • 當調用getView()並且位圖位於緩存中時,直接設置ImageView的位圖。
  • 如果位圖不在緩存中,請在下載完成後將其加載到單獨的線程中,然後將其添加到緩存並在適配器上調用notifyDataSetChanged()。

我還計劃殺死時,活動對象擁有ListView的的onDestroy()未處理的下載 - (甚至在的onPause()或可能 - 法)方法被調用,但最重要的是我要殺死下載當行離開屏幕時,待處理圖像的狀態。我可能實際上只是在短暫的延遲後取消下載,所以如果行再次快速出現在屏幕上,它可以在不浪費帶寬的情況下恢復。

我,不過,我不確定的幾件事:

  • 什麼是當行熄滅屏幕,所以我可以取消下載,以檢測的最佳方式?
  • 調用notifyDataSetChanged()是下載完成後還是有更好的方法?

對整個策略的任何意見,將不勝感激。

回答

8

我不認爲調用notifyDataSetChanged()是真正需要的...我不喜歡它,取消下載:

  • 商店網址爲創建視圖時標籤/更新
  • 下載保存參考視圖圖像時的異步下載的URL
  • 登記在下載線程監聽器(異步任務???) ,我檢查了TAG視圖,如果它匹配 - 我會更新ImageView(在UI線程中很重要,但在使用異步任務時會給出)。圖像也應該存儲在SD卡上(並且每次請求URL時,都應檢查它是否已經下載)。
  • 每當getView()重用視圖(傳遞視圖不爲空)時,我會檢查標記(舊URL),將其替換爲新URL並取消oldURL的下載。

我認爲這是相當多了(某些極端情況可能會發生)......

+0

我想到的一個角落案例是,一排可能會離開屏幕,永遠不會被重用。然後,我永遠不會有機會取消下載。 – JPvdMerwe

+0

相當不可能。這些視圖被ListView非常嚴格地重用......它可能只是「稍微偏離屏幕」(視圖在屏幕後移動1像素時不會立即重用),但這實際上可能會使您獲得「short延遲「行爲是免費的。 –

3

我使用getFirstVisible和getLastVisible適配器視圖性能檢測可見行,並把要求在一個固定大小的堆棧。

我的項目是開源的,有一個最寬鬆的許可證,如果你想使用它: https://github.com/tbiehn/Android-Adapter-Image-Loader

-Travis