Android 多线程下载

转自:http://blog.youkuaiyun.com/rwyz1314/article/details/6919596

  • package my.Thread; 
  •  
  • import java.io.BufferedInputStream; 
  • import java.io.RandomAccessFile; 
  • import java.net.HttpURLConnection; 
  • import java.net.URL; 
  • import java.net.URLConnection; 
  • import java.util.concurrent.CountDownLatch; 
  •  
  •  
  • import android.app.Activity; 
  • import android.os.Bundle; 
  • import android.os.Environment; 
  • import android.view.View; 
  • import android.view.View.OnClickListener; 
  • import android.widget.Button; 
  • import android.widget.TextView; 
  •  
  • public class ManyThreadActivity extends Activity { 
  •     /** Called when the activity is first created. */ 
  •      private Button button; 
  •      private TextView textView; 
  •      private static final int THREAD_COUNT = 4
  •      private CountDownLatch latch = new CountDownLatch(THREAD_COUNT); 
  •      private long completeLength = 0
  •      private long fileLength; 
  •      public static String SaveFile=Environment.getExternalStorageDirectory()+"/DownFile/"+"test.Mp3";   
  •      public static final String url="http://210.30.12.33:8080/mp3/Beyond.mp3"
  •     @Override 
  •     public void onCreate(Bundle savedInstanceState) { 
  •         super.onCreate(savedInstanceState); 
  •         setContentView(R.layout.main); 
  •         button=(Button)findViewById(R.id.button1); 
  •         textView=(TextView) findViewById(R.id.editText1); 
  •         textView.setText(url); 
  •         button.setOnClickListener(new MyListener()); 
  •     } 
  •     class MyListener implements OnClickListener{ 
  •  
  •         @Override 
  •         public void onClick(View v) { 
  •             // TODO Auto-generated method stub 
  •             try
  •                 download(url); 
  •             } catch (Exception e) { 
  •                 // TODO Auto-generated catch block 
  •                 e.printStackTrace(); 
  •             } 
  •         } 
  •          
  •     } 
  •  
  •     //进行下载的线程 
  •     class DownloadThread extends Thread { 
  •         private URL url; 
  •         private RandomAccessFile file; 
  •         private long from; 
  •         private long end; 
  •  
  •         /**
  •          * @param url 下载的URL
  •          * @param file 下载完成之后存储的文件
  •          * @param from 当前线程对应文件的起始位置
  •          * @param end 当前线程对应文件的结束位置
  •          */ 
  •         DownloadThread(URL url, RandomAccessFile file, long from, long end) { 
  •             this.url = url; 
  •             this.file = file; 
  •             this.from = from; 
  •             this.end = end; 
  •         } 
  •  
  •         public void run() { 
  •             try
  •                 long pos = from; 
  •                 byte[] buf = new byte[1024*8]; 
  •  
  •                 HttpURLConnection cn = (HttpURLConnection) url.openConnection(); 
  •                 
  •                 //设置请求的起始和结束位置。 
  •                 cn.setRequestProperty("Range", "bytes=" + from + "-" + end); 
  •  
  •                 BufferedInputStream bis = new BufferedInputStream(cn.getInputStream()); 
  •                 int len; 
  •                 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 (Exception e) { 
  •                 e.printStackTrace(); 
  •             } 
  •             latch.countDown(); 
  •         } 
  •     } 
  •  
  •     public void download(String address) throws Exception { 
  •         URL url = new URL(address); 
  •         URLConnection cn = url.openConnection(); 
  •         fileLength = cn.getContentLength(); 
  •         long packageLength = fileLength / THREAD_COUNT;//每个线程要下载的字节数 
  •         long leftLength = fileLength % THREAD_COUNT;//剩下的字节数 
  •         
  •         RandomAccessFile file = new RandomAccessFile(SaveFile, "rw"); 
  •         
  •         System.out.println(fileLength); 
  •         //计算每个线程请求的起始位置和结束位置。 
  •         /*
  •          * 第一个线程的起始位置是0~0+packageLength(每个线程要下载的字节数)
  •          * 第二个线程的起始位置是endPos+1(第一个线程的packageLength+1)~endPos+1+packageLength
  •          * 第二个线程的起始位置是.........
  •          */ 
  •         long pos = 0
  •         for (int i = 0; i < THREAD_COUNT; i++) { 
  •             long endPos = pos + packageLength; 
  •             new DownloadThread(url, file, pos, endPos).start(); 
  •             if(leftLength > 0) { 
  •                 endPos++; 
  •                 leftLength--; 
  •             } 
  •             pos = endPos; 
  •         } 
  •         latch.await(); 
  •     } 
  •  
  •  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值