listview中之前的延迟加载图片的帖子?

时间:2012-10-25 05:57:10

标签: android android-listview

我在listview中发现了关于延迟加载图像的早期帖子,并尝试使用已发布的答案进行试验(第一个答案带有绿色检查)。 Lazy load of images in ListView

然而,我仍然对两件事情感到困惑:

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

  2. 在帖子的第一个答案中, DrawableManager.fetchDrawable()方法无法直接在listview适配器的getView()方法中使用,看来。我在下面来自ddms log的错误消息(见下文),它说的是' NetworkOnMainThreadException '。那么如何在listview中使用DrawableManager.fetchDrawable()呢?是否只能在列表适配器的getView()函数中使用像DrawableManager.fetchDrawableOnThread()这样的基于线程的实现?

  3. 你能否就这些问题分享一些想法?欣赏它。

    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)
    

2 个答案:

答案 0 :(得分:0)

  1. 延迟加载通常意味着在真正需要之前不会加载资源。在您的示例中,这意味着您所说的内容:第一次显示列表项时,图像将从URL加载。下次可以从内部缓存加载它。但请注意,缓存不要使用太多内存。
  2. 网络访问不应该在UI线程中发生,否则UI将冻结加载资源所花费的时间。我对DrawableManager.fetchDrawableOnThread()一无所知,但我通常使用AsyncTaks。这有助于保持UI响应。只需谷歌“android异步图像加载”或类似的东西,你会发现很多例子。

答案 1 :(得分:0)

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

相关问题