哪个更适合ListView的图像加载?

时间:2010-01-19 08:46:36

标签: android

我想知道两个中哪一个更好地从web中加载listview中的图像,是通过批量通过一些同时运行的线程还是通过线程队列一个接一个地运行?

我注意到(但我不知道这是否真的是实现)来自youtube应用程序的图像是按批次加载的,而且它有点快。即使不仅要加载图像,还要从网上请求一些数据。有没有人有想法?

4 个答案:

答案 0 :(得分:6)

“更好”以哪种方式?表现明智吗?开发者友好?可用性明智吗?

要考虑几个基本的事情:

  1. 创建线程很昂贵。它很慢,每个线程都消耗系统资源(当然)。为每次下载创建单个线程时,请使用托管上限线程池。
  2. 如果图像对用户不可见,请勿加载图像。你应该做的是在getView()的{​​{1}}中,检查图像是否已经加载,如果没有,则重新使用线程池中的线程来完成工作。
  3. 小心使用AsyncTask。据我所知,AsyncTask管理一个固定的应用程序范围的线程池(我认为它的上限为5个线程),所以如果所有这些线程都忙于加载图像,那么你通过该类执行的任何其他任务都将被阻止。
  4. 不要重新发明轮子。 ImageLoaderDroid-Fu是否解决了您的问题?它还实现了缓存,因此图像不会被下载两次。

答案 1 :(得分:1)

拥有此类功能的最佳方法是让列表中的图像“延迟加载”。如果您的列表具有固定大小,则运行多个线程(每个可见列表项一个),下载图像并刷新列表中的图像。在那个平均时间有一些虚拟图像放在同一位置。

只列出固定数量的图像组件,最好比任何一点的总可见图像多一些。每次滚动列表时,检查对应于该特定列表项的图像是否存在。如果是,请显示。如果没有,则显示虚拟图像,运行线程以在后台加载图像,并在下载完成后刷新列表图像。

为了进一步节省内存,您可以对图像组件使用“SoftReferences”。这允许垃圾收集器带走当前未在屏幕上显示的图像。

答案 2 :(得分:1)

我尝试创建一个可以用作参考的简单惰性列表示例,这里是Lazy load of images in ListView

答案 3 :(得分:1)

https://picard.hgo.se/~jakeri03/blog/?p=39

这可能是您正在寻找的,使用固定的线程池和软缓存来延迟加载图像。