Android 之多线程下载原理

在Android之中呢,对于多线程的操作很是平凡,所以对于多线程的理解越深,那么对于自己的程序便能够很好的运行

这也是对于Android开发是一个重要的知识点,那么我们现在来了解多线程的下载原理。

android 多线程下载

多线程下载步骤:

1.本地创建一个跟服务器一样的大小一样的文件 临时文件。

2.计算分配几个线程去下载服务器上的资源 每个文件下载的位置。

3.开启线程,每一个线程下载对应的文件。

4.如果所有的线程都把自己的数据下载完成了,服务器上的资源就被下载到本地了

如图所示:(假设有三个线程在进行下载)

服务器端:

0   1  2  3  4  5  6   7  8  9

1.文件的长度/3,得到每个线程下载文件的长度。(假设有三个线程进行下载)

线程1:下载 0-2

线程2:下载 3-5

线程3:下载 6-到文件末尾

每一个文件下载的位置计算方式

开始位置:

(线程id - 1) * 每一个快的大小

结束位置:

(线程id)* 每一快的大小 - 1

下面,我们先用java代码来实现一下

package com.zengtao.demo;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

public class DemoLoader {

private static DemoLoader loader = new DemoLoader();

private static int threadCount = 3;

private DemoLoader() {

}

// 单例设计模式

public static DemoLoader getInstance() {

return loader;

}

public void downFile(String path) {

// 去服务器端获取文件的长度,在本地创建一个跟服务器一样大小的文件

try {

URL url = new URL(path);

HttpURLConnection connection = (HttpURLConnection) url

.openConnection();

connection.setDoInput(true);

connection.setRequestMethod("GET");

connection.setReadTimeout(5000);

int code = connection.getResponseCode();

if (code == 200) {

// 获取服务器端文件的长度

int fileLength = connection.getContentLength();

// 本地创建一个跟服务器一样大小的文件

RandomAccessFile raf = new RandomAccessFile("setup.ext", "rwd");

raf.setLength(fileLength);

raf.close();

// 假设三个线程下载

int blockSize = fileLength / threadCount;

for (int threadId = 0; threadId < threadCount; threadId++) {

int startIndex = (threadId - 1) * blockSize;

int endIndex = threadId * blockSize - 1;

if (threadId == threadCount) {

endIndex = fileLength;

}

System.out.println("线程:" + threadId + ",下载:" + startIndex

+ "--->" + endIndex);

// 开始下载

new DownLoadThread(threadId, startIndex, endIndex, path)

.start();

}

System.out.println("文件总长度为:" + fileLength);

} else {

System.out.println("请求失败!");

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 下载文件的主线程

*

* @author Administrator zengtao

*

*/

public class DownLoadThread extends Thread {

private int threadId;

private int startIndex;

private int endIndex;

private String path;

/**

*

* @param threadId

*            线程id

* @param startIndex

*            线程下载开始位置

* @param endIndex

*            线程下载结束位置

* @param path

*            线程下载结束文件放置地址

*/

public DownLoadThread(int threadId, int startIndex, int endIndex,

String path) {

super();

this.threadId = threadId;

this.startIndex = startIndex;

this.endIndex = endIndex;

this.path = path;

}

@Override

public void run() {

super.run();

URL url;

try {

url = new URL(path);

HttpURLConnection connection = (HttpURLConnection) url

.openConnection();

// 请求服务器下载部分的文件,制定开始的位置,和结束位置

connection.setRequestProperty("Range", "bytes=" + startIndex

+ "-" + endIndex);

connection.setDoInput(true);

connection.setRequestMethod("GET");

connection.setReadTimeout(5000);

// 从服务器获取的全部数据,返回:200,从服务器获取部分数据,返回:206

int code = connection.getResponseCode();

System.out.println("code = " + code);

InputStream is = connection.getInputStream();

RandomAccessFile raf = new RandomAccessFile("setup.exe", "rwd");

// 随机写文件的时候,从什么时候开始

raf.seek(startIndex);

int len = 0;

byte[] buff = new byte[1024];

while ((len = is.read(buff)) != -1) {

raf.write(buff, 0, len);

}

is.close();

raf.close();

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

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

要使用该类的时候,只需要知道一个url地址,然后调用里面的downFile()方法,就会开始下载文件了,这样实现可以下载一个安装包,比如:在网上下载一个qq,微信等的安装包,自己安装到电脑上,便可以用该方法实现。

时间: 2024-10-08 11:13:25

Android 之多线程下载原理的相关文章

Android中 多线程下载原理

计算每个线程的下载起始终止位置公式如下 文件读写方式4中类型 工程源码目录 package cn.itcast.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownloader { public stat

Android 多线程下载原理剖析

今天带来一个多线程下载的 例子.先看一下效果,点击 下载 开始下载,同时显示下载进度,下载完成,变成程 安装,点击安装 提示 安装应用. 界面效果 这里写图片描述 线程池 ThreadPoolExecutor 在下面介绍实现下载原理的时候,我想尝试倒着来说,这样是否好理解一点? 我们都知道,下载助手,比如360, 百度的 手机助手,下载APP 的时候 ,都可以同时下载多个,所以,下载肯定是多线程的,所以我们就需要一个线程工具类 来管理我们的线程,这个工具类的核心,就是 线程池. 线程池Threa

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

Android版多线程下载器核心代码分享

首先给大家分享多线程下载核心类: 1 package com.example.urltest; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.RandomAccessFile; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 im

Android之——多线程下载演示样例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明白要求将耗时的操作放到一个子线程中运行,文件的下载无疑是须要耗费时间的.所以要将文件的下载放到子线程中运行. 以下,我们一起来实现一个Android中利用多线程下载文件的小样例. 二.服务端准备 在这个小样例中我下面载有道词典为例.在网上下载有道词典的安装包,在eclipse中新建项目web.将下载

Android 模拟多线程下载

以下是一个多线程下载的例子,见代码: 1.首先是布局文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height

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

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

08_多线程下载原理

通过安卓的项目向服务端提交参数.用了三种方式,一种是httpUrlConnection,一种是httpClient,还有一种是使用开源项目去提交参数.掌握多线程下载和断点续传的原理.多线程下载可以把一个文件分成多份去下载.使用多线程下载如果你的带宽比较大,可能会突破对线程流量的限制.在服务端可以对每一个下载的线程的流量/网速/带宽设置一个限制.比如一个线程最多就是100KB/s,如果只是一个线程下载就是100KB/S,你要是开5个线程就是500KB/S.当然了服务端肯定也可以对一个ip连接过来的

多线程下载原理

不管是哪个平台,多线程下载的原理都是这样,所以创建java项目就OK