下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】android中怎么實現(xiàn)下載功能
這篇文章將為大家詳細講解有關android中怎么實現(xiàn)下載功能,文章內(nèi)容質(zhì)量較高,因此在下分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。一:使用多線程實現(xiàn)下載
privateEditTextetpath;//服務地址
privateLinearLayoutll;
//訪問服務器
Stringpath;
//設定線程的數(shù)量
intthreadcount=3;
//定義正在執(zhí)行的線程數(shù)量
intrunningThreadcount=threadcount;
//建一個集合存放進度條
List<ProgressBar>list=newArrayList<ProgressBar>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etpath=(EditText)findViewById(R.id.etpath);
ll=(LinearLayout)findViewById(R.id.ll);
//
加載進度條控件
for(inti=0;i<threadcount;i++){
ProgressBarpb=(ProgressBar)View.inflate(this,R.layout.pb,null);
}
}
publicvoiddownload(Viewview){
//將進度條加入到線性組件中顯示出來
for(inti=0;i<threadcount;i++){
ll.addView(list.get(i));}
newThread(){
publicvoidrun(){
path=etpath.getText().toString().trim();
if(TextUtils.isEmpty(path)){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
Toast.makeText(MainActivity.this,"路徑不能為空",0)
.show();
}
});
return;
}
//下載文件
try{
//創(chuàng)建連接服務器對象
URLurl=newURL(path);
HttpURLConnectionhttp=(HttpURLConnection)url
.openConnection();
//設定連接參數(shù)
http.setRequestMethod("GET");
//設定連接的超時時間
http.setConnectTimeout(5000);
//獲取返回的狀態(tài)嗎
intcode=http.getResponseCode();
if(code==200){
//獲得返回的文件的大小
intlength=http.getContentLength();
//2.創(chuàng)建一個文件和下載的文件大小一樣
RandomAccessFileraf=newRandomAccessFile(
getFileName(path),"rw");
//設置文件的大小
raf.setLength(length);
//3.啟動多個線程下載文件
for(intid=0;id<threadcount;id++){
//計算每個線程要下載的區(qū)塊大小
intblocksize=length/threadcount;
//計算每個線程下載的開始和結(jié)束位置
intstartIndex=id*blocksize;
intendIndex=(id+1)*blocksize-1;
//特殊情況:最后一個線程需要承擔更多的數(shù)據(jù)
if(id==threadcount-1){
endIndex=length-1;
}
//啟動線程下載數(shù)據(jù)
DownLoadThreaddlt=newDownLoadThread(path,id,
startIndex,endIndex);
dlt.start();
}
}
}catch(Exceptione){
e.printStackTrace();
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
Toast.makeText(MainActivity.this,"網(wǎng)絡連接錯誤",0).show();
}
});
}
};
}.start();}//專門下載的類
//專門下載的類
publicclassDownLoadThreadextendsThread{
privateStringpath;
privateintid;
privateintstartIndex;
privateintendIndex;
publicDownLoadThread(Stringpath,intid,intstartIndex,intendIndex){
this.path=path;
this.id=id;
this.startIndex=startIndex;
this.endIndex=endIndex;
}
@Override
publicvoidrun(){
//設置進度條
ProgressBarpb=
list.get(id);
inttotal=0;//記錄每個線程已經(jīng)下載了多少字節(jié)
try{
URLurl=newURL(path);
HttpURLConnectionhttp=(HttpURLConnection)url
.openConnection();
http.setRequestMethod("GET");
http.setConnectTimeout(5000);
//讀取相應的文件,判斷文件是否存在,存在的話,應讀取里面的數(shù)據(jù)
//拿到sd卡的文件an存儲路徑
StringcunPath=Environment.getExternalStorageDirectory().getAbsolutePath();
Filefile=newFile(cunPath+"/"+id+".txt");
if(file.exists()&&file.length()>0){
FileInputStreamfis=newFileInputStream(file);
BufferedReaderbr=newBufferedReader(
newInputStreamReader(fis));
total=Integer.parseInt(br.readLine());
br.close();
//改變線程下載的起始位置
startIndex=
startIndex+total;
System.out.println("線程"+id+"下載的真實范圍:"+startIndex
+"~"+endIndex);
}
//設置最大值
pb.setMax(endIndex-startIndex);
//注意,一定要設置一個請求頭(范圍),指定此線程要下載的數(shù)據(jù)的范圍
http.setRequestProperty("Range","bytes="+startIndex+"-"
+endIndex);
intcode=http.getResponseCode();
//200代表的是服務器把數(shù)據(jù)向客戶端傳輸完畢,206代表的是服務端傳輸局部數(shù)據(jù)完畢
System.out.println("code="+code);
if(code==206){
InputStreamis=http.getInputStream();
//拿到已經(jīng)在硬盤上的對應的文件
RandomAccessFileraf=newRandomAccessFile(
getFileName(path),"rw");
//將文件的指針移動到開始寫入的位置
raf.seek(startIndex);
//將流中的數(shù)據(jù)寫入到文件中
byte[]bs=newbyte[1024];
intb=0;
while((b=is.read(bs))!=-1){
raf.write(bs,0,b);
total+=b;
//真正同步寫入到底層的存儲設備上
RandomAccessFilef=newRandomAccessFile(cunPath+"/"+id+".txt",
"rws");
f.write((total+"").getBytes());
f.close();
//改變進度條的當前位置
pb.setProgress(total);
}
raf.close();
is.close();
System.out.println("線程"+id+"下載完畢");
System.out.println("線程"+id+"下載的范圍是:"+startIndex
+"~"+endIndex);
runningThreadcount--;
System.out.println(runningThreadcount);
if(runningThreadcount==0){
//所有的線程都下載完畢了
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
Toast.mak
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乙肝防治知識培訓課件
- 高爐知識培訓課件圖片
- 化工儀表知識培訓課件
- 中醫(yī)內(nèi)科學課件-不寐
- 二零二五年度大數(shù)據(jù)合資公司成立合同范本3篇
- 二零二五年度工程項目合同管理信息化平臺建設指南3篇
- 2025企業(yè)集團蛇年年會盛典(同心創(chuàng)佳績金蛇啟新章主題)活動策劃方案-60正式版
- 內(nèi)蒙古呼倫貝爾市阿榮旗2024-2025學年七年級上學期1月期末語文試卷(含答案)
- 貴州省部分學校聯(lián)考2024-2025學年高三上學期12月月考語文試卷(含答案)
- 安徽省示范高中2024-2025學年高一(上)期末綜合測試物理試卷(含答案)
- 藝術哲學:美是如何誕生的學習通超星期末考試答案章節(jié)答案2024年
- 鋼箱梁計算分析與案例詳解
- 苯酚及酚類37張課件
- 醫(yī)聯(lián)體綜合績效考核指標體系(醫(yī)聯(lián)體醫(yī)院)
- 中國石油天然氣集團公司建設項目其他費用和相關費用的規(guī)定
- 礦業(yè)煤礦企業(yè)NOSA安健環(huán)風險管理體系推行工作指南(2022版)
- 新項目開發(fā)商業(yè)計劃書模板ppt
- 2021年中國華電集團公司組織架構(gòu)和部門職能
- 林業(yè)標準林業(yè)調(diào)查規(guī)劃設計收費依據(jù)及標準
- 數(shù)學歸納法原理第二歸納法跳躍歸納法反向歸納法
- 七年級數(shù)學幾何證明題(典型)
評論
0/150
提交評論