全国咨询热线:400-618-4000

Android培训之多线程下载器UI设计

更新时间:2016年06月27日17时12分 来源:

Android中数据下载的核心业务逻辑已经完成,下面我们需要优化一下该下载器的UI,实现:根据子线程的个数,动态地添加进度条并更新显示该子线程的下载进度;当数据下载完毕之后弹出toast提示,以便增强用户良好的体验。

1.添加进度条

当用户点击按钮开始下载文件时,手机页面便动态添加若干个进度条,每一个进度条对应一个子线程,分别显示该子线程当前所下载的进度。调整根布局文件,新加一个LinearLayout节点,代码如例1-1:
例1-1

新建一个xml文件pb.xml,用来定义每一个子线程所对应的进度条,代码如例1-2所示:
例1-2

2.查找相关控件

在Activity中查找视图LinearLayout,代码如例1-3
例1-3



    将布局文件pb.xml转化成一个视图View,代码如例1-4
例1-4


点击下载按钮,根据子线程的个数创建对应的进度条ProgressBar,并将该进度条放入ll_container中。代码如例1-5所示:
例1-5


例1-5可知:每一次下载时,根据编辑框子线程的数目新建等量的进度条ProgressBar;然后再将该进度条部署到ll_container视图集合中;最后,定义一个该类的成员变量pbs(是一个List的集合),然后将进度条的引用都添加到该集合中以方便我们对某一个进度条的引用。
此时,运行程序,效果如图1-1所示:


由图1-1可知:在点击“下载”按钮时,程序会创建对应子线程个数的ProgressBar。每一个ProgressBar对应一个子线程,代表该子线程当前下载的进度。那么,我们接下来的工作就是更新ProgressBar的显示问题了,如何动态的更新进度条的显示呢?在之前的文档中,我们已经接触过ProgressBar这一控件,该控件有两个方法,分别是setMax(int max)设定进度条最大显示值和setProgress(int progress)设置进度条当前的显示进度。故,通过这两个方法我们就可以动态的更新每一条子线程对应的下载进度啦!下面是在项目中对这个两个方法参数的获取:
  • 由于每一个子线程下载的数据量是固定的(假设为totalblocksize),所以调用ProgressBar的setMax(totalblocksize)方法便可以设定这个ProgressBar最大范围。
  • 每一个进度条对应一个子线程,该子线程的工作就是不停的从服务端下载指定区间的数据,并将该下载下来的数据写入到本地中,在这个过程中我们得到当前下载的数据量total;若用上一次下载的数据量lastDownloadsize加上当前已下载的数据量total,则可以得到该子线程已经完成下载的总量currentsize。如此,我们就可以调用setProgress(currentsize)来更新进度条的进度啦。对于上一次下载的数据量lastDownloadsize,我们该如何获得呢?每一个线程下载的开始位置都是一定的假设为startindex,而当前子线程下载的起始位置也是可以从临时文件中获取到的假设为newstartindex,故我们可以通过以下方法计算出这个子线程上一次下载的数据量:lastDownloadsize = newstartindex - startindex;

本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/android/