教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Android培訓(xùn)之多線程下載器UI設(shè)計(jì)

更新時(shí)間:2016年06月27日17時(shí)12分 來源: 瀏覽次數(shù):

Android中數(shù)據(jù)下載的核心業(yè)務(wù)邏輯已經(jīng)完成,下面我們需要優(yōu)化一下該下載器的UI,實(shí)現(xiàn):根據(jù)子線程的個(gè)數(shù),動(dòng)態(tài)地添加進(jìn)度條并更新顯示該子線程的下載進(jìn)度;當(dāng)數(shù)據(jù)下載完畢之后彈出toast提示,以便增強(qiáng)用戶良好的體驗(yàn)。

1.添加進(jìn)度條

當(dāng)用戶點(diǎn)擊按鈕開始下載文件時(shí),手機(jī)頁面便動(dòng)態(tài)添加若干個(gè)進(jìn)度條,每一個(gè)進(jìn)度條對(duì)應(yīng)一個(gè)子線程,分別顯示該子線程當(dāng)前所下載的進(jìn)度。調(diào)整根布局文件,新加一個(gè)LinearLayout節(jié)點(diǎn),代碼如例1-1:
例1-1

新建一個(gè)xml文件pb.xml,用來定義每一個(gè)子線程所對(duì)應(yīng)的進(jìn)度條,代碼如例1-2所示:
例1-2

2.查找相關(guān)控件

在Activity中查找視圖LinearLayout,代碼如例1-3
例1-3



    將布局文件pb.xml轉(zhuǎn)化成一個(gè)視圖View,代碼如例1-4
例1-4


點(diǎn)擊下載按鈕,根據(jù)子線程的個(gè)數(shù)創(chuàng)建對(duì)應(yīng)的進(jìn)度條ProgressBar,并將該進(jìn)度條放入ll_container中。代碼如例1-5所示:
例1-5


例1-5可知:每一次下載時(shí),根據(jù)編輯框子線程的數(shù)目新建等量的進(jìn)度條ProgressBar;然后再將該進(jìn)度條部署到ll_container視圖集合中;最后,定義一個(gè)該類的成員變量pbs(是一個(gè)List的集合),然后將進(jìn)度條的引用都添加到該集合中以方便我們對(duì)某一個(gè)進(jìn)度條的引用。
此時(shí),運(yùn)行程序,效果如圖1-1所示:


由圖1-1可知:在點(diǎn)擊“下載”按鈕時(shí),程序會(huì)創(chuàng)建對(duì)應(yīng)子線程個(gè)數(shù)的ProgressBar。每一個(gè)ProgressBar對(duì)應(yīng)一個(gè)子線程,代表該子線程當(dāng)前下載的進(jìn)度。那么,我們接下來的工作就是更新ProgressBar的顯示問題了,如何動(dòng)態(tài)的更新進(jìn)度條的顯示呢?在之前的文檔中,我們已經(jīng)接觸過ProgressBar這一控件,該控件有兩個(gè)方法,分別是setMax(int max)設(shè)定進(jìn)度條最大顯示值和setProgress(int progress)設(shè)置進(jìn)度條當(dāng)前的顯示進(jìn)度。故,通過這兩個(gè)方法我們就可以動(dòng)態(tài)的更新每一條子線程對(duì)應(yīng)的下載進(jìn)度啦!下面是在項(xiàng)目中對(duì)這個(gè)兩個(gè)方法參數(shù)的獲取:
  • 由于每一個(gè)子線程下載的數(shù)據(jù)量是固定的(假設(shè)為totalblocksize),所以調(diào)用ProgressBar的setMax(totalblocksize)方法便可以設(shè)定這個(gè)ProgressBar最大范圍。
  • 每一個(gè)進(jìn)度條對(duì)應(yīng)一個(gè)子線程,該子線程的工作就是不停的從服務(wù)端下載指定區(qū)間的數(shù)據(jù),并將該下載下來的數(shù)據(jù)寫入到本地中,在這個(gè)過程中我們得到當(dāng)前下載的數(shù)據(jù)量total;若用上一次下載的數(shù)據(jù)量lastDownloadsize加上當(dāng)前已下載的數(shù)據(jù)量total,則可以得到該子線程已經(jīng)完成下載的總量currentsize。如此,我們就可以調(diào)用setProgress(currentsize)來更新進(jìn)度條的進(jìn)度啦。對(duì)于上一次下載的數(shù)據(jù)量lastDownloadsize,我們該如何獲得呢?每一個(gè)線程下載的開始位置都是一定的假設(shè)為startindex,而當(dāng)前子線程下載的起始位置也是可以從臨時(shí)文件中獲取到的假設(shè)為newstartindex,故我們可以通過以下方法計(jì)算出這個(gè)子線程上一次下載的數(shù)據(jù)量:lastDownloadsize = newstartindex - startindex;

本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://oisangadgets.com/android/
0 分享到:
和我們在線交談!