使用AsyncTask更新listView加载图片的问题

cycherry 2011-09-07 09:42:49
这里是重写了adapter
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
holder=new NewsHolder();
convertView=inflater.inflate(R.layout.newitem, null);
holder.img=(ImageView)convertView.findViewById(R.id.img);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.content=(TextView)convertView.findViewById(R.id.content);
convertView.setTag(holder);

}else{
holder=(NewsHolder)convertView.getTag();
}
holder.img.setId(position);
holder.img.setTag(this.imgPath[position]);
info=newsList.get(position);
if(info !=null){
holder.title.setText(info.getTitle());
holder.content.setText(info.getContent());

}
//这里是异步调用图片
new CanvasImageTask().execute(holder.img);
holder.img.setDrawingCacheEnabled(true);

return convertView;
}


这是异步类
public class CanvasImageTask extends AsyncTask<ImageView, Void, Bitmap> {
private ImageView gView;

protected Bitmap doInBackground(ImageView... views) {
Bitmap bmp = null;
ImageView view = views[0];
// 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。
if (view.getTag() != null) {
try {
URL url = new URL(view.getTag().toString());
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(stream);
stream.close();
} catch (Exception e) {
Log.v("img", e.getMessage());
return null;
}
}
this.gView = view;
return bmp;
}

protected void onPostExecute(Bitmap bm) {
if (bm != null) {
//此处更新图片
this.gView.setImageBitmap(bm);
this.gView = null;
}
}


我想问的是,adapter里的getView是当信息的显示超过一个屏幕的高度时,在listView中向下滑动鼠标或拖曳时都会触发getView加载信息,这样会导致了重复执行new CanvasImageTask().execute(holder.img);从而重复加载获取网络图片,大大增加了上网流量和浏览速度,该怎么解决这个问题呢?
...全文
1256 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy_nanchang 2012-11-06
  • 打赏
  • 举报
回复
感觉都没有解决问题啊,楼主的问题是下拉的太快的时候,通过getView会发出太多请求,这些请求都是新的图片的请求,用Map或者list缓存没有任何帮助啊,中间滑动太快的图片请求还是会发送出去啊。 我现在也碰到了这个问题,不知道怎么解决,现在的思路就是滑动太快或者拖拽时不发送图片请求,但是这个不知道怎么实现。
阿俊Star 2011-09-23
  • 打赏
  • 举报
回复
怎么看不了呢
androidwdz 2011-09-09
  • 打赏
  • 举报
回复
新手不太明天.能否发下改进了的代码啊 不胜感激!
tonyzzp 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cycherry 的回复:]

1楼的方法是可以,但是还是有点小问题,就是一开始的时候往下拉,下面的图片还没显示出来,如果上面的图片先显示出来的,下面的list就会先显示上面的图片,等到自己的图片下好了,再显示回自己的图片
[/Quote]
那是因为你的NewsHolder的问题吧,
直接convertView.getTag()的时候得到的是前面显示过的,已经有图片了。
所以你应该
if(map.containsKey(position+"")){
holder.img.setimagebitmap(map.get(position));
}else{
holder.img.setimagebitmap(null);
}
cycherry 2011-09-07
  • 打赏
  • 举报
回复
1楼的方法是可以,但是还是有点小问题,就是一开始的时候往下拉,下面的图片还没显示出来,如果上面的图片先显示出来的,下面的list就会先显示上面的图片,等到自己的图片下好了,再显示回自己的图片
jianghao3616 2011-09-07
  • 打赏
  • 举报
回复
可以考虑本地缓存么,如果图片量不大的话楼上的方法也可以吧,我菜鸟,随便说说
tonyzzp 2011-09-07
  • 打赏
  • 举报
回复
我用的解决办法是用一个Map<Integer,Bitmap>
cavasImageTask取到图片后把图片放到map里
键是listivew的position。
在getView里面先判断map里是否有,如果有直接拿,没有的话再asyncTask.execute.
cycherry 2011-09-07
  • 打赏
  • 举报
回复
恩恩,谢谢tonyzzp的热心回答啦~
是我一时疏忽了,问题解决啦

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧