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
- Android-AsyncTask结合Listview 下载显示
- Android自定义圆形进度条,结合AsyncTask下载显示进度
- ListView结合AsyncTask获取数据
- Android使用AsyncTask下载显示图片
- android AsyncTask下载文件并且显示进度
- ListView和AsyncTask结合实现下拉刷新
- Android Listview显示网络下载的图片
- AsyncTask下载图片、显示进度
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android 结合实例学会AsyncTask的用法
- Android 结合实例学会AsyncTask的用法
- Android AsyncTask Demo异步下载
- android.os.AsyncTask(文件下载)
- Android中用ListView显示网络下载的Bitmap
- Android中listView中用于下载、显示图片
- android 模拟listview多线程下载进度条显示不干扰
- 高质量C++/C编程指南(重要)
- poj 2007 凸包 极角排序
- 部分代码混淆
- KMP-字符串快速匹配算法
- HTTP和HTTPS详解
- Android-AsyncTask结合Listview 下载显示
- eclipse 下 Android 最火的快速开发框架androidannotations配置详解
- Algorithm FourthEdition : 第二本专业相关书籍
- linux防火墙查看
- 剖析 Android 属性动画,知其然知其所以然(上)
- Spring学习笔记(一)
- FindKeyConflicts 用于找出键值映射(Key Mapping)冲突的插件(sublime text3)
- 关于路由器,锐捷破解,mentohust的使用
- Eventbus 事件总线