您的位置:首页 > 理论基础 > 计算机网络

Android中ListView使用- 网络图片的异步加载

2010-09-24 21:59 741 查看
最近自己在试着使用Android开发一个新浪微薄的手机客户端,学习Android 的应用开发,来做点笔记吧。

主要讲讲ListView的使用过程中的一些问题。

我从新浪服务器获取数据,有文本有图片,通过图片的URL来载入图片,但是在Android的SDK中ListView默认的是不能支持通过URL来载入网络图片的,需要自己重写其中的SDK的默写类中的方法。我们知道,ListView一般是配合ListActivity使用的,在使用时需要传入SimpleAdatper对象来和数据进行绑定,我通过阅读SimpleAdapter的源码发现,只要我们改写七种的方法setViewImage的实现即可以达到目的。

一开始我是这样改的:

public void setViewImage(ImageView v, String value) {
Bitmap bmp = BitmapFactory.decodeStream(new URL(value).openStream);
v.setImageBitmap(bmp);
}


但是运行的时候发现界面很容易就死掉了,无法动弹,用户体验不行。

细想,手机客户端访问网络的速度显然是不能和PC相比的,哪怕小小的图片文件可能也需要很长的一段时间,何况是一个列表有好多个待下载的图片呢,不死才怪。

于是乎想到异步下载图片,于是重写setViewImage()函数的实现:

public void setViewImage(ImageView v, String value) {
new ImageDownloadTask().execute(value, v);
}
private class ImageDownloadTask extends AsyncTask<Object, Object, Bitmap>{
private ImageView imageView = null;
@Override
protected Bitmap doInBackground(Object... params) {
// TODO Auto-generated method stub
Bitmap bmp = null;
imageView = (ImageView) params[1];
try {
bmp = BitmapFactory.decodeStream(new URL((String)params[0]).openStream());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bmp;
}

protected void onPostExecute(Bitmap result){
imageView.setImageBitmap(result);
}
}


这下好了,用户可以首先看到显示的文本信息,图片可以在用户浏览文字的同时多线程的下载,不会影响用户体验。

上图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐