工具类代码:

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","image/gif,image/jpeg,image/pjpeg,image/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","image/gif,image/jpeg,image/pjpeg,image/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();}});}}

更多相关文章

  1. android webview 下载文件
  2. Android(安卓)中文API下载
  3. Android:开发环境搭建
  4. Android中Dialog实现自定义弹出对话框
  5. Android自定义对话框
  6. Android之TabHost
  7. android 线程睡几秒
  8. 安卓线程三种简易使用
  9. android 自定义Dialog设置背景颜色

随机推荐

  1. Android之AlertDialog.Builder详解
  2. android蓝牙模块
  3. CentOS 安装 Android
  4. android 弹出日期选择框
  5. 使用组件构建Android应用程序
  6. 使用Android新式LruCache缓存图片,基于线
  7. Android仿iPhone的日期时间选择器
  8. 自定义一个简易的RecyclerView的LinearLa
  9. use ffmpeg to setup streaming server o
  10. Android(安卓)TimePicker