android 实现多线程下载

public void DownLoad(String urlString,int threadSize) throws UnknownHostException, IOException
    {
        URL url=new URL(urlString);
        HttpURLConnection con=(HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setConnectTimeout(5000);
   
    int filelength=con.getContentLength();//获得文件大小
    pb.setMax(filelength);//设置进度条最大值
   
   
    String fileName=urlString.substring(urlString.lastIndexOf('/')+1);//获得文件名
    File saveFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath(),fileName);
    RandomAccessFile accessFile=new RandomAccessFile(saveFile, "rwd");
    accessFile.setLength(filelength);//设置跟下载文件一样大小
    accessFile.close();
    //计算每个线程下载数
    int block=filelength%threadSize==0? filelength/threadSize : filelength/threadSize+1;
    for(int threadid=0;threadid<threadSize;threadid++)
    {
    new DownloadThread(url, saveFile, block, threadid).start();
    }
   
    }
    private class DownloadThread extends Thread{
    private URL url;
private File saveFile;
private int block;
private int threadid;
public DownloadThread(URL url, File saveFile, int block, int threadid) {
this.url = url;
this.saveFile = saveFile;
this.block = block;
this.threadid = threadid;
}


public void run() {
int startposition = threadid * block;//每个线程开始位置
int endposition = (threadid + 1 ) * block - 1;//每个线程结束位置
try {
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.seek(startposition);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);//从文件什么位置写入
InputStream inStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
accessFile.write(buffer, 0, len);//写入数据
Message message=Message.obtain();
message.arg1=len;
handler.sendMessage(message);//通知Handler更新进度条
}
inStream.close();
accessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值