0

我遇到了一篇关于列表视图中延迟加载图像的早期帖子,并尝试尝试发布的答案(第一个答案带有绿色检查)。在 ListView 中延迟加载图像

但是我仍然对两件事感到困惑:

  1. 列表视图中“延迟加载”的定义是什么?从我之前从 UI 的角度来看,如果项目图像存储在手机本地,“延迟加载”意味着您不会开始加载列表项目,直到用户可以看到或滚动到该项目(当项目超过 1 个屏幕时) )。但是在这里,将图像存储在远程 url 中,这似乎意味着“第一次从 url 加载图像,然后从本地缓存加载”,这是“懒惰”的想法吗?

  2. 在帖子的第一个答案中,似乎不能在 listview 适配器的 getView() 方法中直接使用 DrawableManager.fetchDrawable() 方法。我从 ddms 日志中得到低于错误消息(见下文),它说的是关于“ NetworkOnMainThreadException ”。那么 DrawableManager.fetchDrawable() 如何在这里的 listview 中使用呢?只有像 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)
4

2 回答 2

0

您应该调用fetchDrawableOnThread方法并将您的 url 和 imageview 作为参数传递,因为通过调用此方法,您将图像下载任务提供给非 ui 线程,然后通过使用Handler更新 ui 发送消息。

于 2012-10-25T06:22:30.927 回答
0
  1. 延迟加载通常意味着在真正需要资源之前不会加载资源。在您的示例中,这正是您所说的:一旦第一次显示列表项,图像就会从 URL 加载。下次它可以从内部缓存中加载。请注意缓存不要使用太多内存。
  2. 网络访问不应该发生在 UI 线程中,否则 UI 将在加载资源时冻结。我对 DrawableManager.fetchDrawableOnThread() 一无所知,但我通常为此使用 AsyncTaks。这有助于保持 UI 响应。只需谷歌搜索“android async image loading”或类似的东西,你会发现很多例子。
于 2012-10-25T06:16:02.243 回答