Android 一个下载任务分为多个线程下载
16lz
2021-01-23
[java] view plain copy print ?
- packagemy.Thread;
- importjava.io.BufferedInputStream;
- importjava.io.RandomAccessFile;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- importjava.net.URLConnection;
- importjava.util.concurrent.CountDownLatch;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- publicclassManyThreadActivityextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- privateButtonbutton;
- privateTextViewtextView;
- privatestaticfinalintTHREAD_COUNT=4;
- privateCountDownLatchlatch=newCountDownLatch(THREAD_COUNT);
- privatelongcompleteLength=0;
- privatelongfileLength;
- publicstaticStringSaveFile=Environment.getExternalStorageDirectory()+"/DownFile/"+"test.Mp3";
- publicstaticfinalStringurl="http://210.30.12.33:8080/mp3/Beyond.mp3";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- button=(Button)findViewById(R.id.button1);
- textView=(TextView)findViewById(R.id.editText1);
- textView.setText(url);
- button.setOnClickListener(newMyListener());
- }
- classMyListenerimplementsOnClickListener{
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- try{
- download(url);
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- //进行下载的线程
- classDownloadThreadextendsThread{
- privateURLurl;
- privateRandomAccessFilefile;
- privatelongfrom;
- privatelongend;
- /**
- *@paramurl下载的URL
- *@paramfile下载完成之后存储的文件
- *@paramfrom当前线程对应文件的起始位置
- *@paramend当前线程对应文件的结束位置
- */
- DownloadThread(URLurl,RandomAccessFilefile,longfrom,longend){
- this.url=url;
- this.file=file;
- this.from=from;
- this.end=end;
- }
- publicvoidrun(){
- try{
- longpos=from;
- byte[]buf=newbyte[1024*8];
- HttpURLConnectioncn=(HttpURLConnection)url.openConnection();
- //设置请求的起始和结束位置。
- cn.setRequestProperty("Range","bytes="+from+"-"+end);
- BufferedInputStreambis=newBufferedInputStream(cn.getInputStream());
- intlen;
- while((len=bis.read(buf))>0){
- synchronized(file){
- file.seek(pos);
- file.write(buf,0,len);
- }
- pos+=len;
- completeLength+=len;
- System.out.println(completeLength*100/fileLength+"%");
- }
- cn.disconnect();
- }catch(Exceptione){
- e.printStackTrace();
- }
- latch.countDown();
- }
- }
- publicvoiddownload(Stringaddress)throwsException{
- URLurl=newURL(address);
- URLConnectioncn=url.openConnection();
- fileLength=cn.getContentLength();
- longpackageLength=fileLength/THREAD_COUNT;//每个线程要下载的字节数
- longleftLength=fileLength%THREAD_COUNT;//剩下的字节数
- RandomAccessFilefile=newRandomAccessFile(SaveFile,"rw");
- System.out.println(fileLength);
- //计算每个线程请求的起始位置和结束位置。
- /*
- *第一个线程的起始位置是0~0+packageLength(每个线程要下载的字节数)
- *第二个线程的起始位置是endPos+1(第一个线程的packageLength+1)~endPos+1+packageLength
- *第二个线程的起始位置是.........
- */
- longpos=0;
- for(inti=0;i<THREAD_COUNT;i++){
- longendPos=pos+packageLength;
- newDownloadThread(url,file,pos,endPos).start();
- if(leftLength>0){
- endPos++;
- leftLength--;
- }
- pos=endPos;
- }
- latch.await();
- }
- }
保存为test.mp3文件
本文出自:http://blog.csdn.net/rwyz1314/article/details/6919596
更多相关文章
- android EditText插入字符串到光标所在位置
- Android 获取文件目录以及文件的删除 .
- android 使用http协议上传文件
- android Pull方式解析xml文件
- android Http文件上传
- Android拖动控件改变其位置
- Android Studio生成APK文件名带上版本号等信息
- android文件管理器(1)
- 在android中获取文件的MD5值