Android-AsyncTask结合Listview 下载显示

                             Android-AsyncTask结合Listview 下载显示

     
    一.AsyncTask结合Listview 下载图片
                     
                  异步任务的介绍以及方法的介绍 参照以下这篇博客:   
                         
                                                Android多线程编程AsyncTaks
                                          (   http://blog.csdn.net/gjy_it/article/details/51861785)

                   可滚动到最后下载代码,根据代码结合文章进行分析。

       二. 配合的使用的工具
模拟服务器。 可以在这边下载文件 下载地址:http://download.csdn.net/detail/gjy_it/9608536
设置IP地址:
在虚拟系统的左侧栏中 直接将文件拖进去 右键可以赋值URL链接(下载的链接)。

 三. 进入需求分析
注意 在项目中:
添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
在异步任务中下载文件的耗时操作是在
下载完后,返回一个bitmap,之后在下面这个方法进行设置图片:
1.问题:下载完成后,滑动ListView,下载过的图片再次下载
原因:ListView每显示一行都会调用getview() ,会多次启动异步 任务下载图片
解决:创建容器保存下载过的图片,,再次滑动到该行时判断是否下载过
下载过:复用 没有下载过:启动异步任务下载图片
于是   private Map<Integer, Bitmap> bitmaps; 用键值对来保存当前 listview 对应item 的下载过的图片。
在 异步任务 下载完后 将当前的position 传到异步任务处理类 然后put(position, result) 将下载的结果保存到容器。
在适配器getView 中 根据position 来获取 ibitmap (Bitmap bitmap = bitmaps.get(position);)判断 是否为null
不为null 则设置图片。这样的话 如果为NULL 则启动异步任务。 这样就解决第一个问题了。
2.问题:下载过程中,滑动ListView,已经下载过的图片再次下载
原因:下载过程中,图片还未下载完成bimap为空,再次滑动到该行,就会再次启动 异步任务
解决:创建容器保存启动过的异步任务,判断该行的异步任务是否启动过,没有启动过再启动异步任务
既然会重复调用 异步任务 则用容器保存 异步任务的tag ,每次启动异步任务的时候 先获取到 当前item position对应的异步任务
是否 打开过 如果打开过 则就不打开。 (在每次启动之后 将任务对象 保存到容器里去)
 
3.问题:下载过程中,滑动ListView,图片下载完成,但是ListView没有显示
原因:下载过程中,快速滑动ListView创建新的ImageView对象
但是task更新的是之前的ImageView对象
解决:创建更新控件的方法,将当前新的ImageView对象传到task中更新
在此之前 在getView 方法中都是还没有进行优化的。
优化后:
优化过程中,因为复用的原因 会导致 有多个任务 同时 下载的是同一个 holder 的imageView  
接下来的问题 和解决方案:
1.问题:下载完成后,缓慢滑动ListView,没有下载图片的行显示图片 之后后图片出现跳变
原因:复用行布局
解决:
if (convertView == null)
	{
	    convertView = LayoutInflater.from(mContext).inflate(R.layout.layout, null);
	    mHolder = new ViewHolder(convertView);
	    convertView.setTag(mHolder);
	} else
	{
	    mHolder = (ViewHolder) convertView.getTag();
	}

	mHolder.mImageView.setImageResource(R.drawable.ic_launcher);
添加最后一行代码即可,让这一行没下载完 则用默认的图片代替。
2.问题2:下载过程,滑动ListView,发现没有下载图片的行显示图片 之后后图片出现跳变
原因:复用行布局 ,在后台task更新同一个ImageView
解决:判断异步任务所在的行是否在可见行,在可见行才更新控件,否则就不更新
到这里,完整的 异步任务结合listView 核心 思路就完成。的
完整的代码Demo:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值