Android中數(shù)據(jù)下載的核心業(yè)務(wù)邏輯已經(jīng)完成,下面我們需要優(yōu)化一下該下載器的UI,實現(xiàn):根據(jù)子線程的個數(shù),動態(tài)地添加進(jìn)度條并更新顯示該子線程的下載進(jìn)度;當(dāng)數(shù)據(jù)下載完畢之后彈出toast提示,以便增強用戶良好的體驗。
1.添加進(jìn)度條
當(dāng)用戶點擊按鈕開始下載文件時,手機頁面便動態(tài)添加若干個進(jìn)度條,每一個進(jìn)度條對應(yīng)一個子線程,分別顯示該子線程當(dāng)前所下載的進(jìn)度。調(diào)整根布局文件,新加一個LinearLayout節(jié)點,代碼如例1-1:
例1-1
新建一個xml文件pb.xml,用來定義每一個子線程所對應(yīng)的進(jìn)度條,代碼如例1-2所示:
例1-2
2.查找相關(guān)控件
在Activity中查找視圖LinearLayout,代碼如例1-3
例1-3
將布局文件pb.xml轉(zhuǎn)化成一個視圖View,代碼如例1-4
例1-4
點擊下載按鈕,根據(jù)子線程的個數(shù)創(chuàng)建對應(yīng)的進(jìn)度條ProgressBar,并將該進(jìn)度條放入ll_container中。代碼如例1-5所示:
例1-5
例1-5可知:每一次下載時,根據(jù)編輯框子線程的數(shù)目新建等量的進(jìn)度條ProgressBar;然后再將該進(jìn)度條部署到ll_container視圖集合中;最后,定義一個該類的成員變量pbs(是一個List的集合),然后將進(jìn)度條的引用都添加到該集合中以方便我們對某一個進(jìn)度條的引用。
此時,運行程序,效果如圖1-1所示:
由圖1-1可知:在點擊“下載”按鈕時,程序會創(chuàng)建對應(yīng)子線程個數(shù)的ProgressBar。每一個ProgressBar對應(yīng)一個子線程,代表該子線程當(dāng)前下載的進(jìn)度。那么,我們接下來的工作就是更新ProgressBar的顯示問題了,如何動態(tài)的更新進(jìn)度條的顯示呢?在之前的文檔中,我們已經(jīng)接觸過ProgressBar這一控件,該控件有兩個方法,分別是setMax(int max)設(shè)定進(jìn)度條最大顯示值和setProgress(int progress)設(shè)置進(jìn)度條當(dāng)前的顯示進(jìn)度。故,通過這兩個方法我們就可以動態(tài)的更新每一條子線程對應(yīng)的下載進(jìn)度啦!下面是在項目中對這個兩個方法參數(shù)的獲?。?br />
- 由于每一個子線程下載的數(shù)據(jù)量是固定的(假設(shè)為totalblocksize),所以調(diào)用ProgressBar的setMax(totalblocksize)方法便可以設(shè)定這個ProgressBar最大范圍。
- 每一個進(jìn)度條對應(yīng)一個子線程,該子線程的工作就是不停的從服務(wù)端下載指定區(qū)間的數(shù)據(jù),并將該下載下來的數(shù)據(jù)寫入到本地中,在這個過程中我們得到當(dāng)前下載的數(shù)據(jù)量total;若用上一次下載的數(shù)據(jù)量lastDownloadsize加上當(dāng)前已下載的數(shù)據(jù)量total,則可以得到該子線程已經(jīng)完成下載的總量currentsize。如此,我們就可以調(diào)用setProgress(currentsize)來更新進(jìn)度條的進(jìn)度啦。對于上一次下載的數(shù)據(jù)量lastDownloadsize,我們該如何獲得呢?每一個線程下載的開始位置都是一定的假設(shè)為startindex,而當(dāng)前子線程下載的起始位置也是可以從臨時文件中獲取到的假設(shè)為newstartindex,故我們可以通過以下方法計算出這個子線程上一次下載的數(shù)據(jù)量:lastDownloadsize = newstartindex - startindex;
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/android/