文档章节

Android菜鸟之路-多线程下载

别志华
 别志华
发布于 2014/12/20 20:40
字数 613
阅读 18
收藏 0

Android客户端下载步骤

  1. 在Android客户端首先创建一个空文件(空白文件),大小跟服务器的一模一样。
  2. 开启若干线程,分别去下载服务器上对应的资源。
  3. 如果所有的线程都下载完毕,服务器的资源就下载完毕。

Android客户端下载逻辑

  1. 获取到服务器端资源文件的大小(connection.getContentLength())

    String path = "http://localhost:8080/ff.exe";
    
    URL url = new URL(path);
    
    // 获取链接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
    // 参数
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(5000);
    
    // 响应码
    int responseCode = connection.getResponseCode();
    
    if (responseCode == 200) {
    
    	// 得到服务端返回的文件大小
    	long contentLength = connection.getContentLength();
    	System.out.println("服务器文件大小:"+contentLength);
    }
    
    // 断开连接
    connection.disconnect();
    
  2. 在本地创建一个大小和服务器一样的的空白文件

     File file = new File("temp.ext");
     RandomAccessFile raf= new RandomAccessFile(file, "rw");
     raf.setLength(contentLength);
    
  3. 根据开启线程的数量,把服务器资源给等分成若干份(threadCount:线程数量)

    假设文件大小是10个byte。(长度:length)
    假设3个线程(线程数量:threadCount)。
     int blockSize = length / threadCount;
    线程1 下载3个byte	1-3		0 * blockSize + 1 ~ 1 * blockSize
    线程2 下载3个byte	4-6		1 * blockSize + 1 ~ 2 * blockSize 
    线程3 下载4个byte	7-10	2 * blockSize + 1 ~ 3 * blockSize(length)
    
    // 开启若干个子线程,分别去下载对应的资源
    long threadCount = 3;
    long blockSize = contentLength / threadCount;
    
    for (int i = 1; i <= threadCount; i++) {
    	// 计算下载起始、结束位置
    	long startIndex = (i - 1) * blockSize + 0;// 服务器也是从0开始
    	long endIndex = i * blockSize - 1; //
    	// 最后一个线程
    	if (i == threadCount) {
    		endIndex = contentLength - 1;
    	}
    	System.out.println("开启线程:" + i + ",下载的位置:(" + startIndex + "~"
    			+ endIndex + ")");
    	new DownloadThread(i, startIndex, endIndex, path).start();
    }
    
  4. 创建线程类

     static class DownloadThread extends Thread {
     	private int threadId;
     	private long startIndex;
     	private long endIndex;
     	private String path;
    
     	public DownloadThread(int threadId, long startIndex, long endIndex,
     			String path) {
     		super();
     		this.threadId = threadId;
     		this.startIndex = startIndex;
     		this.endIndex = endIndex;
     		this.path = path;
     	}
    
     	public void run() {
     		URL url;
     		try {
     			url = new URL(path);
    
     			// 获取链接
     			HttpURLConnection connection = (HttpURLConnection) url
     					.openConnection();
    
     			// 参数
     			connection.setRequestMethod("GET");
     			connection.setConnectTimeout(5000);
     			// 告诉服务器下载的参数
     			connection.setRequestProperty("Range", "bytes=" + startIndex
     					+ "-" + endIndex);
    
     			// 响应码
     			int responseCode = connection.getResponseCode();
    
     			System.out.println("服务器状态码:" + responseCode);
     			// 下载服务器文件,返回的是206
     			if (responseCode == 206) {
     				InputStream inputStream = connection.getInputStream();
    
     				File file = new File("temp.exe");
     				RandomAccessFile raf = new RandomAccessFile(file, "rw");
     				// 指定文件开始写的位置
     				raf.seek(startIndex);
     				System.out.println("第" + threadId + "个线程,写文件的开始、结束位置("
     						+ (startIndex) + "," + (endIndex) + ")");
    
     				int len = 0; 
     				byte[] buf = new byte[1024];
     				while ((len = inputStream.read(buf)) != -1) {
     					raf.write(buf, 0, len);
     				}
    
     				inputStream.close();
     				raf.close();
     				System.out.println("第" + threadId + "个线程下载完毕了");
    
     			}
     		} catch (Exception e) {
     			// TODO Auto-generated catch block
     			e.printStackTrace();
     		}
     	}
     }
    

© 著作权归作者所有

别志华
粉丝 1
博文 1
码字总数 613
作品 0
大兴
私信 提问
关于选择职业生涯的在校大学生诸多问题,真诚请教高手前辈们解答

前辈们,大牛们好!我是在校大学生,现在大二,有几个问题啊想请教你们。真诚希望作答!1:近期有个安卓越的培训机构来我们学校宣传,我想问一下最近几年安卓开发的行情(我现在是一个什么也...

溪枫
2013/04/19
1K
21
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
2018/06/21
0
0
Android RadioButton实现Tab问题

我是一名Java程序猿,最近想学习Android应用开发,于是下载了OSC的Android版本客户端源码。然后参照客户端的功能,自己动手实践。先参照实现了用RadioButton实现的底部Tab栏,以及头部自定义...

熊猫大侠到此一游
2013/05/22
2.8K
1
Android多线程,让耗时的操作去后台运行吧

在android程序中,会有一些耗时的操作,比如从网上抓取图片,下载文件,批量更新数据库等,这些操作对于手机而言会需要很长的时间,而应用程序界面又不能等到这些操作完成后再显示,所以要让...

wuwulh
2010/08/23
32.9K
16
Android 水果机游戏实例解析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] Android 水果机游戏实例解析 近段时间在手游方面的学习主要集中在Cocos2d-x上。有引擎的确是...

长平狐
2013/03/19
844
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
32分钟前
4
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
4
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
13
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部