2011-01-06 55 views
0

在Android應用程序中,我有一組縮略圖可供下載。當用戶使用該應用時,這組縮略圖可能會達到100個或更多項目。Android:帶有許多圖像的圖庫 - 如何根據需要下載圖像?

縮略圖需要顯示在圖庫中,現在當顯示圖庫時,我啓動一個線程從0下載所有縮略圖到集合的末尾。這在很多方面都很糟糕 - 即使不需要也下載每個圖像,並且如果圖庫具有居中的第30個元素,則在下載所有前20個圖像之前,用戶將不會看到任何圖像。

理想情況下,我希望圖像根據需要進行下載和顯示 - 因此,如果第30個元素居中顯示圖庫時,則會下載並顯示第29,30和31個元素,然後如果用戶向左滾動,28日,27日等將被下載。我不確定這是否現實/有效。

我已經嘗試啓動線程以下載圖庫適配器類(它擴展了ArrayAdapter)中的圖像,但顯然它會爲每個圖像啓動一個新線程,因此它會滾動,導致應用程序變得無法使用。

有沒有人有關於如何做到這一點的想法/建議?

乾杯, r3mo

回答

2

您可能還想跟蹤哪些圖像當前處於視圖中,因此您可以殺死滾動過去的線程。

例如:

  1. 用戶打開應用程序,看到圖象1,2,3
  2. 你開始下載1,2,和3具有高優先級。
  3. 您開始下載優先級較低的4,5和6。
  4. 用戶滾動到圖像23,24和25.
  5. 您花一點時間確保它們已停止。
  6. 您取消1-6的線程並開始下載具有高優先級的23,24和25。
  7. 您開始下載20,21和22以及更低優先級的26,27和28。

根據測試節目顯示的是線程池的大小,您甚至可以將預加載進一步擴展。使用速度而不是暫停來確定何時開始下載某些內容的獎勵點,所以即使它們緩慢滾動,也會執行此操作。雙倍獎金積分緩存一切你可以。

1

「我試圖啓動一個線程下載的圖片在畫廊適配器類(它擴展ArrayAdapter),但因爲它是滾動這顯然開始一個新的線程爲每個圖像,所以該應用程序變得無法使用。「

您可以使用一些具有固定數量的線程的ThreadPool來防止啓動太多的線程。

1.)您的ThreadPool具有固定數量的線程。 2.)你添加一個新的Runnable來執行 a)有'休息'線程,它會執行給定的Runnable b)。池中的所有線程都'工作',你的新的Runnable被入隊BlockingQueue池,等待執行

0

您也可以只有1個線程下載圖像和要下載的圖像列表。

主線程只會添加一些圖像在列表中下載(也許刪除一些,如果他們不再可見)。 下載線程只會從列表中下載圖像。

你現在有一個經典的生產者/消費者模式!

希望它有幫助,