Android通过HTTP协议实现多线程下载

标签: android http 多线程 | 发表时间:2017-02-20 09:58 | 作者:jishudaren
分享到:
出处:http://www.iteye.com

import java.io.File;  

import java.io.InputStream;  

import java.io.RandomAccessFile;  

import java.net.HttpURLConnection;  

import java.net.URL;  

  

public class MulThreadDownload {  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        String path = "http://net.itcast.cn/QQWubiSetup.exe";  

        try {  

            new MulThreadDownload().download(path, 3);  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

    }  

    /** 

     * 从路径中获取文件名称 

     * @param path 下载路径 

     * @return 

     */  

    public static String getFilename(String path){  

        return path.substring(path.lastIndexOf('/')+1);  

    }  

    /** 

     * 下载文件 

     * @param path 下载路径 

     * @param threadsize 线程数 

     */  

    public void download(String path, int threadsize) throws Exception{  

        URL url = new URL(path);  

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  

        conn.setRequestMethod("GET");  

        conn.setConnectTimeout(5 * 1000);  

        int filelength = conn.getContentLength();//获取要下载的文件的长度  

        String filename = getFilename(path);//从路径中获取文件名称  

        File saveFile = new File(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 final class DownloadThread extends Thread{  

        private URL url;  

        private File saveFile;  

        private int block;//每条线程下载的数据长度  

        private int threadid;//线程id  

  

        public DownloadThread(URL url, File saveFile, int block, int threadid) {  

            this.url = url;  

            this.saveFile = saveFile;  

            this.block = block;  

            this.threadid = threadid;  

        }  

  

        @Override  

        public void run() {  

            //计算开始位置公式:线程id*每条线程下载的数据长度= ?  

            //计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?  

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

                }  

                inStream.close();  

                accessFile.close();  

                System.out.println("线程id:"+ threadid+ "下载完成");  

            } catch (Exception e) {  

                e.printStackTrace();  

            }  

        }         

    }  

  

}



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android http 多线程] 推荐:

Android通过HTTP协议实现多线程下载

- - 移动开发 - ITeye博客
     * 从路径中获取文件名称 .      * @param path 下载路径 .      * 下载文件 .      * @param path 下载路径 .      * @param threadsize 线程数 .         int filelength = conn.getContentLength();//获取要下载的文件的长度  .

Android中HTTP相关的API

- - 技术小黑屋
Android中大多数应用都会发送和接受HTTP请求,在Android API中主要由两个HTTP请求的相关类,一个是HttpURLConnection,另一个是Apache HTTP Client. 这两个类实现的HTTP请求都支持HTTPS协议,基于流的上传和下载,可配置超时时间,IPv6和连接池.

Android实战技巧:多线程AsyncTask

- - CSDN博客推荐文章
AsyncTask是Android 1.5 Cubake加入的用于实现异步操作的一个类,在此之前只能用Java SE库中的Thread来实现多线程异步,AsyncTask是Android平台自己的异步工具,融入了Android平台的特性,让异步操作更加的安全,方便和实用. 实质上它也是对Java SE库中Thread的一个封装,加上了平台相关的特性,所以对于所有的多线程异步都强烈推荐使用AsyncTask,因为它考虑,也融入了Android平台的特性,更加的安全和高效.

Android多任务多线程下载

- - 移动开发 - ITeye博客
关注微信号:javalearns   随时随地学Java. 打算实现一个下载功能,当然理想的功能要支持多任务下载、多线程下载、断点续传的功能,我想一步一步来,首先困难摆在了多任务这里. 开始的思路是在一个Service中启动下载的流操作,然后通过Service中声明一个Activity中的Handler更新UI(比如进度条.

Android 平台 HTTP网速测试 案例 API 分析

- - CSDN博客推荐文章
作者 : 万境绝尘  . 工信部规定的网速测试标准 : 除普通网页测速采用单线程外,用户宽带接入速率测试应使用多线程(多TCP连接)HTTP下载进行测速,测试中使用的线程数量为N(N≥4). -- 建立连接 : 用户终端设备发起测试请求后,与测速平台建立 N 条 TCP 连接,并在每一条 TCP 连接上发送HTTP[GET]请求发起一次测试过程.

Android开发--多线程下载加断点续传

- - CSDN博客推荐文章
        文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步.         1.多线程下载:.                首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位置是i * range到(i + 1) * rang  - 1,注意最后一段的位置是到filesize - 1;.

(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258) - 小菜美妞成长中

- - 博客园_首页
Android性能优化系列---Improving Layout Performance(一).         Layouts是Android应用里直接影响用户体验的一个关键部分. 如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢. Android SDK提供了工具帮助你分析你的Layouts的性能问题.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

HTTP Header 详解

- - 博客园_Ruby's Louvre
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议. HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应. 就整个网络资源传输而言,包括message-header和message-body两部分. 首先传递message- header,即 http header消息.