摘要:隨著中國移動互聯(lián)網(wǎng)3G時(shí)代的到來,基于Android手機(jī)平臺的多線程文件下載器將成為網(wǎng)民通過3G網(wǎng)絡(luò)獲取和共享資源的一個(gè)重要渠道,多線程文件下載器實(shí)現(xiàn)用戶在線下載網(wǎng)絡(luò)資源,保存下載資源的斷點(diǎn)數(shù)據(jù),為用戶提供了友好的手機(jī)平臺資源下載功能。它改變傳統(tǒng)的手機(jī)下載資源的方式,突破了傳統(tǒng)下載工具的枷鎖,實(shí)現(xiàn)快速方便的下載資源,節(jié)省網(wǎng)絡(luò)流量。該程序跨平臺性強(qiáng),運(yùn)行速度快,用戶可以快速下載應(yīng)用、apk程序等資源、高效執(zhí)行下載操作,滿足用戶需求達(dá)到了預(yù)期效果。
關(guān)鍵詞:下載器;多線程;斷點(diǎn)續(xù)傳;Android
中圖分類號: TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2012)28-6711-03
如今3G時(shí)代已經(jīng)來臨,隨著智能手機(jī)硬件配置不斷提升,運(yùn)行在手機(jī)平臺的應(yīng)用程序?qū)映霾桓F,企業(yè)應(yīng)用、游戲、金融、炒股等軟件給人們帶來極大方便,隨時(shí)隨地掏出手機(jī)就可以查找自己所需要的資源,人們可以通過電腦和手機(jī)來下載安裝手機(jī)應(yīng)用程序。為了實(shí)現(xiàn)在手機(jī)上直接通過3G網(wǎng)絡(luò)下載網(wǎng)絡(luò)資源,本文研究和設(shè)計(jì)了“多線程文件下載器”幫助用戶在線下載網(wǎng)絡(luò)資源,如果出現(xiàn)網(wǎng)絡(luò)異常,可以保存下載資源的斷點(diǎn)數(shù)據(jù),在下次網(wǎng)絡(luò)連接時(shí)可繼續(xù)下載,節(jié)省了手機(jī)流量,為用戶提供了友好的手機(jī)平臺資源下載功能,給用戶的下載帶來了更大的方便。
1 系統(tǒng)設(shè)計(jì)
1.1 Android平臺簡介
Android是一種以Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),主要使用于便攜設(shè)備。Android的系統(tǒng)架構(gòu)和其它操作系統(tǒng)一樣,采用了分層的架構(gòu)。android分為四個(gè)層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫層和linux核心層。作為一款開放式的操作系統(tǒng),隨著Android的快速發(fā)展,如今已允許開發(fā)者使用多種編程語言來開發(fā)Android應(yīng)用程序,而不再是以前只能使用Java開發(fā)Android應(yīng)用程序的單一局面,因而受到眾多開發(fā)者的歡迎,成為真正意義上的開放式操作系統(tǒng)[1]。
1.2 多線程下載的設(shè)計(jì)
線程可以理解為下載的通道,一個(gè)線程就是一個(gè)文件的下載通道,多線程也就是同時(shí)開起好幾個(gè)下載通道.當(dāng)服務(wù)器提供下載服務(wù)時(shí),使用下載者是共享帶寬的,在優(yōu)先級相同的情況下,總服務(wù)器會對總下載線程進(jìn)行平均分配。不難理解,如果你線程多的話,那下載的越快?,F(xiàn)流行的下載軟件都支持多線程。
多線程下載的原理是這樣的:通常服務(wù)器同時(shí)與多個(gè)用戶連接,用戶之間共享帶寬。如果N個(gè)用戶的優(yōu)先級都相同,那么每個(gè)用戶連接到該服務(wù)器上的實(shí)際帶寬就是服務(wù)器帶寬的N分之一??梢韵胂螅绻脩魯?shù)目較多,則每個(gè)用戶只能占有可憐的一點(diǎn)帶寬,下載將會是個(gè)漫長的過程。如果你通過多個(gè)線程同時(shí)與服務(wù)器連接,那么你就可以榨取到較高的帶寬了。
1.3 斷點(diǎn)續(xù)傳的設(shè)計(jì)
使用多線程斷點(diǎn)續(xù)傳下載器在下載的時(shí)候多個(gè)線程并發(fā)可以占用服務(wù)器端更多資源,從而加快下載速度,在下載過程中記錄每個(gè)線程已拷貝數(shù)據(jù)的數(shù)量,如果下載中斷,比如無信號斷線、電量不足等情況下,這就需要使用到斷點(diǎn)續(xù)傳功能,下次啟動時(shí)從記錄位置繼續(xù)下載,可避免重復(fù)部分的下載。這里采用SQL Lite數(shù)據(jù)庫來記錄下載的進(jìn)度。
在實(shí)現(xiàn)斷點(diǎn)續(xù)傳下載的時(shí)候,需要把線程每次下載結(jié)束后的當(dāng)前任務(wù)信息都保存到數(shù)據(jù)庫里面一次,相當(dāng)于每次一個(gè)線程下載一次,就給當(dāng)前任務(wù)拍個(gè)照片,把當(dāng)前信息存到數(shù)據(jù)庫里面。這樣一旦暫停,或者退出程序,下次再下載的時(shí)候,直接從數(shù)據(jù)庫里面讀數(shù)據(jù),然后在這個(gè)數(shù)據(jù)的基礎(chǔ)上繼續(xù)下載就行。
斷點(diǎn)數(shù)據(jù)表對應(yīng)數(shù)據(jù)庫中表,存儲下載數(shù)據(jù)大小,如下載連接地址、線程ID、下載文件大小等,具體設(shè)計(jì)如表1所示。
表1 斷點(diǎn)數(shù)據(jù)表
[數(shù)據(jù)字段名\&數(shù)據(jù)類型\&字段意義\&id\?(Auto)\&標(biāo)識(遞增字段)\&DownPath\&Char(1000)\&下載連接地址\&threadid\&Integer\&線程ID\&DownLength\&Integer\&下載文件大?。?amp;]
2 系統(tǒng)的實(shí)現(xiàn)
2.1 搭建Andriod平臺
開發(fā)Android至少需要如下工具和開發(fā)包:JDK1.6以上、Eclipse、Android SDK、ADT[2]。
第一步:先安裝Android SDK,Android SDK可以在線安裝,在安裝之前要保證網(wǎng)絡(luò)的正常連接。第二步:安裝Ecllipse插件ADT,可以直接在Eclipse中直接安裝ADT。安裝完ADT后,還需要設(shè)置一下Android SDK的安裝目錄[3]。
2.2 多線程下載的實(shí)現(xiàn)
多線程下載的實(shí)現(xiàn)過程:
1)首先得到下載文件的長度,然后設(shè)置本地文件的長度。
HttpURLConnection.getContentLength();
RandomAccessFile file = new RandomAccessFile("Test.exe","rwd");
file.setLength(filesize);
2)根據(jù)文件長度和線程數(shù) 計(jì)算每條線程下載的數(shù)據(jù)長度和下載位置。如:文件的長度為6M,線程數(shù)為3,那么,每條線程下載的數(shù)據(jù)長度為2M[4]。
3)使用Http的Range頭字段指定每條線程從文件的什么位置開始下載,下載到什么位置為止,如:指定從文件的2M位置開始下載,下載到位置(4M-1byte)為止,代碼如下:
HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303");
4)保存文件,使用RandomAccessFile類指定每條線程從本地文件的什么位置開始寫入數(shù)據(jù)。
RandomAccessFile threadfile = new RandomAccessFile("Test.exe ","rwd");
threadfile.seek(2097152);
核心代碼如下:
2.3 斷點(diǎn)續(xù)傳的實(shí)現(xiàn)
斷點(diǎn)續(xù)傳的實(shí)現(xiàn)步驟[5]:
1) 斷點(diǎn)續(xù)傳需要在下載過程中記錄每條線程的下載進(jìn)度。
2) 每次下載開始之前先讀取數(shù)據(jù)庫,查詢是否有未完成的記錄,有就繼續(xù)下載,沒有則創(chuàng)建新記錄插入數(shù)據(jù)庫。
3) 在每次向文件中寫入數(shù)據(jù)之后,在數(shù)據(jù)庫中更新下載進(jìn)度。
4) 下載完成之后刪除數(shù)據(jù)庫中下載記錄。
5) Handler傳輸數(shù)據(jù)查看下載進(jìn)度:這個(gè)主要用來記錄百分比,每下載一部分?jǐn)?shù)據(jù)就通知主線程來記錄時(shí)間,主線程中創(chuàng)建的View只能在主線程中修改,其他線程只能通過和主線程通信,在主線程中改變View數(shù)據(jù)??梢允褂肏andler可以處理這種需求,主線程中創(chuàng)建Handler,重寫handleMessage()方法,新線程中使用Handler發(fā)送消息,主線程即可收到消息,并且執(zhí)行handleMessage()方法[6]。
3 結(jié)束語
本論文研究和設(shè)計(jì)了安卓環(huán)境下斷點(diǎn)續(xù)傳與多線程的下載功能的下載器的核心功能的具體實(shí)現(xiàn)方法,具有比較好的實(shí)用性,突破了傳統(tǒng)下載工具的枷鎖,實(shí)現(xiàn)快速方便的下載資源,節(jié)省網(wǎng)絡(luò)流量。該程序跨平臺性強(qiáng),運(yùn)行速度快,用戶可以快速下載應(yīng)用、apk程序等資源、高效執(zhí)行下載操作。
參考文獻(xiàn):
[1] 楊豐盛.Android應(yīng)用開發(fā)揭秘[M].北京:機(jī)械工業(yè)出版社,2010:48-50.
[2] 公磊.基于Android的移動終端應(yīng)用程序開發(fā)與研究[J].計(jì)算機(jī)于現(xiàn)代化,2008,7(15):35-37.
[3] 姚昱旻,劉衛(wèi)國.Android的架構(gòu)與應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(11):42-44.
[4] 陳昱,江蘭帆.基于Google Android平臺的移動開發(fā)研究[J].福建電腦,2008,15(24):42-44.
[5] 張利國,代聞,龔海平.Android移動開發(fā)案例詳解[M].北京:人民郵電出版社,2010:125-126.
[6] 余志龍.Google Android SDK開發(fā)范例大全[M].北京:人民郵電出版社,2011:85-8