Android 使用HttpURLConnection 实现多线程下载
工具类代码:
packagecom.example.xiaocool.multithreadclient;importjava.io.InputStream;importjava.io.RandomAccessFile;importjava.net.HttpURLConnection;importjava.net.URL;publicclassDownUtil{//定义下载资源的路径privateStringpath;//指定所下载的文件的保存位置privateStringtargetFile;//定义需要使用多少线程下载资源privateintthreadNum;//定义下载的线程对象privateDownThread[]threads;//定义下载的文件的总大小privateintfileSize;publicDownUtil(Stringpath,StringtargetFile,intthreadNum){this.path=path;this.threadNum=threadNum;//初始化threads数组threads=newDownThread[threadNum];this.targetFile=targetFile;}publicvoiddownload()throwsException{URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5*1000);conn.setRequestMethod("GET");conn.setRequestProperty("Accept","p_w_picpath/gif,p_w_picpath/jpeg,p_w_picpath/pjpeg,p_w_picpath/pjpeg,"+"application/x-shockwave-flash,application/xaml+xml,"+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"+"application/x-ms-application,application/vnd.ms-excel,"+"application/vnd.ms-powerpoint,application/msword,*/*");conn.setRequestProperty("Accept-Language","zh-CN");conn.setRequestProperty("Charset","UTF-8");conn.setRequestProperty("Connection","Keep-Alive");//得到文件大小fileSize=conn.getContentLength();conn.disconnect();intcurrentPartSize=fileSize/threadNum+1;RandomAccessFilefile=newRandomAccessFile(targetFile,"rw");//设置本地文件的大小file.setLength(fileSize);file.close();for(inti=0;i<threadNum;i++){//计算每条线程的下载的开始位置intstartPos=i*currentPartSize;//每个线程使用一个RandomAccessFile进行下载RandomAccessFilecurrentPart=newRandomAccessFile(targetFile,"rw");//定位该线程的下载位置currentPart.seek(startPos);//创建下载线程threads[i]=newDownThread(startPos,currentPartSize,currentPart);//启动下载线程threads[i].start();}}//获取下载的完成百分比publicdoublegetCompleteRate(){//统计多条线程已经下载的总大小intsumSize=0;for(inti=0;i<threadNum;i++){sumSize+=threads[i].length;}//返回已经完成的百分比returnsumSize*1.0/fileSize;}privateclassDownThreadextendsThread{//当前线程的下载位置privateintstartPos;//定义当前线程负责下载的文件大小privateintcurrentPartSize;//当前线程需要下载的文件块privateRandomAccessFilecurrentPart;//定义已经该线程已下载的字节数publicintlength;publicDownThread(intstartPos,intcurrentPartSize,RandomAccessFilecurrentPart){this.startPos=startPos;this.currentPartSize=currentPartSize;this.currentPart=currentPart;}@Overridepublicvoidrun(){try{URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5*1000);conn.setRequestMethod("GET");conn.setRequestProperty("Accept","p_w_picpath/gif,p_w_picpath/jpeg,p_w_picpath/pjpeg,p_w_picpath/pjpeg,"+"application/x-shockwave-flash,application/xaml+xml,"+"application/vnd.ms-xpsdocument,application/x-ms-xbap,"+"application/x-ms-application,application/vnd.ms-excel,"+"application/vnd.ms-powerpoint,application/msword,*/*");conn.setRequestProperty("Accept-Language","zh-CN");conn.setRequestProperty("Charset","UTF-8");InputStreaminStream=conn.getInputStream();//跳过startPos个字节,表明该线程只下载自己负责哪部分文件。inStream.skip(this.startPos);byte[]buffer=newbyte[1024];inthasRead=0;//读取网络数据,并写入本地文件while(length<currentPartSize&&(hasRead=inStream.read(buffer))>0){currentPart.write(buffer,0,hasRead);//累计该线程下载的总大小length+=hasRead;}currentPart.close();inStream.close();}catch(Exceptione){e.printStackTrace();}}}}
MainActivity:
packagecom.example.xiaocool.multithreadclient;importandroid.os.Handler;importandroid.os.Message;importandroid.support.v7.app.ActionBarActivity;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ProgressBar;importjava.util.Timer;importjava.util.TimerTask;publicclassMainActivityextendsActionBarActivity{EditTexturl;EditTexttarget;ButtondownBn;ProgressBarbar;DownUtildownUtil;privateintmDownStatus;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);url=(EditText)findViewById(R.id.url);target=(EditText)findViewById(R.id.target);downBn=(Button)findViewById(R.id.down);bar=(ProgressBar)findViewById(R.id.bar);//创建一个Handler对象finalHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){if(msg.what==0x123){bar.setProgress(mDownStatus);}}};downBn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){//初始化DownUtil对象最后一个参数指定线程数downUtil=newDownUtil(url.getText().toString(),target.getText().toString(),6);newThread(){@Overridepublicvoidrun(){try{//开始下载downUtil.download();}catch(Exceptione){e.printStackTrace();}//定义美妙调度获取一次系统的完成进度finalTimertimer=newTimer();timer.schedule(newTimerTask(){@Overridepublicvoidrun(){//获取下载任务的完成比例doublecompleteRate=downUtil.getCompleteRate();mDownStatus=(int)(completeRate*100);handler.sendEmptyMessage(0x123);//下载完成后取消任务调度if(mDownStatus>=100){timer.cancel();}}},0,100);}}.start();}});}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。