android异步加载ListView中的图片
在项目里面使用ListView,并要求ListView的条目中有图片显示,而且这个图片是通过网络动态获取的。
这时候,会发现ListView加载很慢,半天才显示出来,影响了用户的体验。
这是因为,使用了当前线程(绘制ui的线程)去下载图片。应该另外开辟线程异步下载图片。
实现的效果如下:
http://easymorse.googlecode.com/svn/tags/android.lazyload.listview-1.0/
其中,数据来源于assets/list.xml,我通过xstream将它映射为NewsBean的列表。
这部分代码见com.easymorse.list.ListViewDemoActivity的:
private List getList() {
try {
XStream xStream = new XStream();
xStream.alias(“item”, NewsBean.class);
return (List) xStream.fromXML(this.getAssets().open(
“list.xml”));
有关xstream的代码,还可以参见android下通过xstream解析xml格式信息。
项目有两个布局文件,main.xml和news_row.xml文件。前者是Activity的布局文件,后者是列表每一行的布局文件。
这里需要注意的是,ListView在main.xml布局文件中的id,需要写成:
android:id=”@android:id/list”
否则会报错。而且,Activity需要继承ListActivity。
因为使用了自定义的列表行布局,因此需要自己写ListAdapter。在这里是
MyImageAndTextListAdapter。该类通过AsyncImageLoader类实现对图片的异步加载;通过:
private Map
viewMap
实现对异步加载了的图片做缓存。如果尚未加载图片,news_row.xml文件中声明了默认的图片文件:
android:src=”@drawable/d1″
在AsyncImageLoader中异步加载图片,使用了回调方式,通过:
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable,String imageUrl);
}
这里做的比较粗糙,为每个图片都创建了下载图片的线程。当图片下载成功后,通过android的Handler机制,将图片对象(Drawable)作为消息的对象(Message.obj),传递给Handler,再通过ImageCallback刷新ui中的图。
3 Comments to “android异步加载ListView中的图片”
Android联合开发 API 中文文档 (42) —— ListView 方法学习 | Android联合开发网 — 2011年01月20日 @ 13:51
这篇文章上的评论的 RSS feed TrackBack URI
By deli, 2011年06月2日 @ 23:53
marshal兄,这些问题早有现成的库,这个 https://github.com/commonsguy/cwac-thumbnail 是不错的选择。
By robi, 2011年12月15日 @ 21:49
回复deli,你说的库https://github.com/commonsguy/cwac-thumbnail
试了,代码看起来很复杂。不简洁。相比喜欢楼主的。