2012-10-25 50 views
0

我遇到了一個關於在listview中延遲加載圖像的早期文章,並嘗試用已發佈的答案進行實驗(第一個答案與綠色檢查)。 Lazy load of images in ListView懶惰加載圖像在ListView的前一篇文章?

但是我仍然有兩件事情混爲一談:

  1. 什麼是在一個列表視圖中的「懶加載」的定義是什麼? 從我之前認爲的UI角度來看,如果項目圖像本地存儲在手機中,「延遲加載」意味着您不會開始加載列表項目,直到用戶可以看到或滾動到該項目(當項目超過1屏幕)。但是,在這裏,圖像存儲在遠程URL中,這似乎意味着'圖像是從URL第一次加載的,之後將從本地緩存中加載',這是'懶惰'的想法嗎?

  2. 在第1個回答的帖子裏,這個DrawableManager.fetchDrawable()方法不能直接在listview適配器的getView()方法中使用,看起來好像。我從ddms日誌(參見下文)獲取下面的錯誤消息,並且它說''NetworkOnMainThreadException'。那麼如何在這裏使用ListView中的DrawableManager.fetchDrawable()?是否真的只有像DrawableManager.fetchDrawableOnThread()這樣的基於線程的實現可以在列表適配器的getView()函數中使用?

你可以分享一些關於這些問題的想法嗎?欣賞它。

10-25 04:52:43.628: E/AndroidRuntime(2231): FATAL EXCEPTION: main 
10-25 04:52:43.628: E/AndroidRuntime(2231): android.os.NetworkOnMainThreadException 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at com.example.fairfax.MainActivity$DrawableManager.fetch(MainActivity.java:230) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at com.example.fairfax.MainActivity$DrawableManager.fetchDrawable(MainActivity.java:187) 
10-25 04:52:43.628: E/AndroidRuntime(2231):  at com.example.fairfax.MainActivity$LazyAdapter.getView(MainActivity.java:162) 
+0

我建議你嘗試Fedor的懶加載邏輯:http://stackoverflow.com/a/3068012/379693 –

+1

謝謝帕雷希。這是一個很好的建議。 – user1559625

回答

0
  1. 懶加載一般指資源不加載,直到真正需要它。在你的例子中,這意味着你剛剛說的:只要第一次顯示列表項,就會從URL中加載圖像。下次它可以從內部緩存加載。使用緩存時要小心,不要使用太多的內存。
  2. 網絡訪問不應該在UI線程中發生,否則UI將凍結加載資源所需的時間。我對DrawableManager.fetchDrawableOnThread()一無所知,但我通常使用AsyncTaks。這有助於保持UI的響應。只是谷歌的「Android異步圖像加載」或類似的東西,你會發現很多的例子。
0

你應該叫fetchDrawableOnThread方法,因爲調用此方法你給圖像下載任務到非UI線程,然後通過使用Handler更新的用戶界面發送消息通過您的網址和ImageView的作爲參數,可以 。