[java] view plain copy print ?
  1. packagemy.Thread;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.RandomAccessFile;
  4. importjava.net.HttpURLConnection;
  5. importjava.net.URL;
  6. importjava.net.URLConnection;
  7. importjava.util.concurrent.CountDownLatch;
  8. importandroid.app.Activity;
  9. importandroid.os.Bundle;
  10. importandroid.os.Environment;
  11. importandroid.view.View;
  12. importandroid.view.View.OnClickListener;
  13. importandroid.widget.Button;
  14. importandroid.widget.TextView;
  15. publicclassManyThreadActivityextendsActivity{
  16. /**Calledwhentheactivityisfirstcreated.*/
  17. privateButtonbutton;
  18. privateTextViewtextView;
  19. privatestaticfinalintTHREAD_COUNT=4;
  20. privateCountDownLatchlatch=newCountDownLatch(THREAD_COUNT);
  21. privatelongcompleteLength=0;
  22. privatelongfileLength;
  23. publicstaticStringSaveFile=Environment.getExternalStorageDirectory()+"/DownFile/"+"test.Mp3";
  24. publicstaticfinalStringurl="http://210.30.12.33:8080/mp3/Beyond.mp3";
  25. @Override
  26. publicvoidonCreate(BundlesavedInstanceState){
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.main);
  29. button=(Button)findViewById(R.id.button1);
  30. textView=(TextView)findViewById(R.id.editText1);
  31. textView.setText(url);
  32. button.setOnClickListener(newMyListener());
  33. }
  34. classMyListenerimplementsOnClickListener{
  35. @Override
  36. publicvoidonClick(Viewv){
  37. //TODOAuto-generatedmethodstub
  38. try{
  39. download(url);
  40. }catch(Exceptione){
  41. //TODOAuto-generatedcatchblock
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. //进行下载的线程
  47. classDownloadThreadextendsThread{
  48. privateURLurl;
  49. privateRandomAccessFilefile;
  50. privatelongfrom;
  51. privatelongend;
  52. /**
  53. *@paramurl下载的URL
  54. *@paramfile下载完成之后存储的文件
  55. *@paramfrom当前线程对应文件的起始位置
  56. *@paramend当前线程对应文件的结束位置
  57. */
  58. DownloadThread(URLurl,RandomAccessFilefile,longfrom,longend){
  59. this.url=url;
  60. this.file=file;
  61. this.from=from;
  62. this.end=end;
  63. }
  64. publicvoidrun(){
  65. try{
  66. longpos=from;
  67. byte[]buf=newbyte[1024*8];
  68. HttpURLConnectioncn=(HttpURLConnection)url.openConnection();
  69. //设置请求的起始和结束位置。
  70. cn.setRequestProperty("Range","bytes="+from+"-"+end);
  71. BufferedInputStreambis=newBufferedInputStream(cn.getInputStream());
  72. intlen;
  73. while((len=bis.read(buf))>0){
  74. synchronized(file){
  75. file.seek(pos);
  76. file.write(buf,0,len);
  77. }
  78. pos+=len;
  79. completeLength+=len;
  80. System.out.println(completeLength*100/fileLength+"%");
  81. }
  82. cn.disconnect();
  83. }catch(Exceptione){
  84. e.printStackTrace();
  85. }
  86. latch.countDown();
  87. }
  88. }
  89. publicvoiddownload(Stringaddress)throwsException{
  90. URLurl=newURL(address);
  91. URLConnectioncn=url.openConnection();
  92. fileLength=cn.getContentLength();
  93. longpackageLength=fileLength/THREAD_COUNT;//每个线程要下载的字节数
  94. longleftLength=fileLength%THREAD_COUNT;//剩下的字节数
  95. RandomAccessFilefile=newRandomAccessFile(SaveFile,"rw");
  96. System.out.println(fileLength);
  97. //计算每个线程请求的起始位置和结束位置。
  98. /*
  99. *第一个线程的起始位置是0~0+packageLength(每个线程要下载的字节数)
  100. *第二个线程的起始位置是endPos+1(第一个线程的packageLength+1)~endPos+1+packageLength
  101. *第二个线程的起始位置是.........
  102. */
  103. longpos=0;
  104. for(inti=0;i<THREAD_COUNT;i++){
  105. longendPos=pos+packageLength;
  106. newDownloadThread(url,file,pos,endPos).start();
  107. if(leftLength>0){
  108. endPos++;
  109. leftLength--;
  110. }
  111. pos=endPos;
  112. }
  113. latch.await();
  114. }
  115. }

Android 一个下载任务分为多个线程下载_第1张图片

保存为test.mp3文件

Android 一个下载任务分为多个线程下载_第2张图片

本文出自:http://blog.csdn.net/rwyz1314/article/details/6919596


更多相关文章

  1. android EditText插入字符串到光标所在位置
  2. Android 获取文件目录以及文件的删除 .
  3. android 使用http协议上传文件
  4. android Pull方式解析xml文件
  5. android Http文件上传
  6. Android拖动控件改变其位置
  7. Android Studio生成APK文件名带上版本号等信息
  8. android文件管理器(1)
  9. 在android中获取文件的MD5值

随机推荐

  1. mac 搭建APK反编译环境
  2. android 实现Iphone效果Switch,
  3. 57.android 简单的自定义DatePicker颜色,
  4. Android根据Data匹配隐式Intent的实例
  5. android使用http协议实现文件的上传
  6. library里面使用butterknife的正确姿势(an
  7. android OpenGL ES 2.0
  8. android 数据库操作异常
  9. 如何打包Android(安卓)Wearable 应用程序
  10. 第三章 Libgdx必备工具