工具类代码:

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();}});}}

wKiom1VEeMqSv4t8AAE9dJHufSg637.jpg

更多相关文章

  1. Android 自定义AlertDialog 并且4个角为圆角
  2. Android 自定义带百分比的进度条
  3. android 字体大小像素的设置
  4. android 字体大小,样式 ,像素的设置
  5. 安卓线程三种简易使用
  6. android 自定义Dialog设置背景颜色
  7. android获取设备屏幕大小的方法
  8. android 线程睡几秒
  9. Android自定义对话框

随机推荐

  1. android里getView,inflate,listview问题
  2. android上多样式文本的使用
  3. Android积木之图片的生成和保存
  4. 从源码一次彻底理解Android的消息机制
  5. cocos2d-x 移植安卓错误解决
  6. Android(安卓)sdk更新代理配置
  7. android定时器
  8. android实现退出时关闭所有activity
  9. Delphi XE5 Android(安卓)调用手机震动
  10. android 获取当前时间