Android-AsyncTask结合Listview 下载显示

来源:互联网 发布:土豆客户端 mac 编辑:程序博客网 时间:2024/06/05 14:53

                             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:
代码Demo


0 0
原创粉丝点击