Java 在ListView中显示下载图像的最有效方法?

Java 在ListView中显示下载图像的最有效方法?,java,android,performance,Java,Android,Performance,我目前正在使用一个自定义适配器在ListView中每行显示一个ImageView和两个TextView 在适配器的重写getView中,ImageView有以下代码: final ImageView img = (ImageView) view.findViewById(R.id.rowImg); new Thread(new Runnable() { public void run() { final BitmapDrawable b = downloadAvatar

我目前正在使用一个自定义适配器在ListView中每行显示一个ImageView和两个TextView

在适配器的重写getView中,ImageView有以下代码:

final ImageView img = (ImageView) view.findViewById(R.id.rowImg);

new Thread(new Runnable() {
    public void run() {
        final BitmapDrawable b = downloadAvatar(urlToDownload);
        img.post(new Runnable() {
            public void run() {
                img.setImageDrawable(b);
            }
        });
    }
}).start();

下载化身方法基本上只使用AndroidHttpClient和HttpGet。上述方法可行,但我的问题是如何优化它?滚动是起伏的;我知道它可能会调用getView()并在每次进入可视区域时下载图像。有什么提示吗?

在您的情况下,您需要执行所谓的“延迟加载图像”操作,一旦下载,这些图像就会被缓存。检查此项:

我建议使用,它有一个名为的组件,该组件将异步加载url图像,库还将保留这些图像的缓存,因此不会在每次重新创建
ListView
行时下载这些图像


我使用它,我发现它非常有用和健壮。

请参见下面的延迟加载listview的源链接和通用图像加载程序示例,它可能会对您有所帮助

这里有一个选项:

getView
内部检查是否下载了当前图像。如果它还没有下载-下载它并将其存储在您选择的目录中。如果它存在于该目录中,只需加载它


根据图像大小和数量,您还可以创建某种缓存来存储可见对象所需的图像对象(可能是可见对象上方和下方最近的不可见对象)项目。

如果你看过谷歌IO 2012视频。他们已经解决了完全相同的问题。考虑使用LRUCache来缓存图像。所以你不需要每次在用户滚动时下载它们。