Android多线程下载文件

Android 实现多线程下载:

首先看下效果图:

UI界面

多线程下载的时候log打印界面

开始工作,首先我们通过HttpURLConnection类连接需要下载的文件:

new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					url = new URL(DOWNURL);
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					// conn.connect();
					totalLength = conn.getContentLength();
					System.out.println(totalLength);
					singleLength = (totalLength + THREADNUM - 1) / THREADNUM;
					startDown();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		}).start();

其中根据conn.getContentLength()函数计算需要下载文件的总字节长度

得到总长度后通过singleLength = (totalLength + THREADNUM - 1) / THREADNUM;计算出每个线程所负责的模块单位长度,在这里大家想一下为什么用这个公式而不是直接

singleLength = totalLength / THREADNUM;计算呢?

计算出单个线程负责模块长度后就方便了,我们直接通过循环调用多个线程,每个线程负责自己的下载模块,再此之前我们需要计算出每个木块下载的开始和结束位置

private void startDown() {
		for (int i = 0; i < THREADNUM; i++) {
			File cacheFile = new File(cacheDir, "temp" + i);

			long begin = i * singleLength + cacheFile.length();
			long end = begin + singleLength - 1;
			System.out.println("第" + i + "个缓存文件:" + begin + "-" + end);
			new downThread(begin, end, cacheFile).start();
		}
	}

然后开启多线程下载任务

class downThread extends Thread{
		private long begin;
		private long end;
		private File cacheFile;

		public downThread(long begin, long end, File cacheFile) {
			super();
			this.begin = begin;
			this.end = end;
			this.cacheFile = cacheFile;
		}

		@Override
		public void run() {
			try {
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				conn.setRequestProperty("Range", "bytes=" + begin + "-"
						+ end);
				FileOutputStream out = new FileOutputStream(cacheFile);
				InputStream in = conn.getInputStream();
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = in.read(buffer)) != -1)
					out.write(buffer, 0, len);
				in.close();
				out.close();
				System.out.println(cacheFile.toString()+"缓存文件下载完成");
				megageFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

这里核心代码既是通过conn.setRequestProperty("Range", "bytes=" + begin + "-"+ end);这个语句控制每次请求服务器所下载的文件位置,其他地方和普通请求完全一致;

每个线程完成后,我们需要合并每个线程的缓存文件,合并缓存文件的时候要判断每个线程负责的模块都下载完毕并保证是顺序合并,

这里怎么实现,即 megageFile();  这个函数的核心代码是什么呢?

我刚开始的时候下载文件内容1234567890 合并后就变成了 5678123490 ;     这里就不贴代码了留给大家思索

源码下载(附cache文件合并方法):点击打开链接

时间: 2024-10-21 23:38:29

Android多线程下载文件的相关文章

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

多线程下载文件(支持暂停、取消、断点续传)

多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

android程序----&gt;android多线程下载(二)

上篇我们讲到了android中下载的断点续传问题,今天我们开始学习下载的多线程问题.本次的多线程源码下载:androdi中多线程下载的实现代码.有关断点续传的问题,请参见博客:android程序---->android多线程下载(一) 目录导航 android中多线程下载的思路 android中多线程中的原理说明 android中多线程下载的实现 友情链接 android中多线程下载的思路 一. 多线程下载的步骤说明: 第一步: 我们要获得下载资源的的长度,用http请求中HttpURLConn

android程序----&gt;android多线程下载(一)

多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次下载的进度继续下载.对于android中的下载,我想分多个部分去讲解分析.今天,我们就首先开始android中下载断点续传代码的实现.关于多线程下载单个文件的实现,请参见博客:android程序---->android多线程下载(二) 目录导航 android中断点续传的思路 android断点续传

Andoid 更好的Android多线程下载框架

概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度可配置,像超时时间这类 业务数据和下载数据分离 下面我们在说下该框架能实现那些的应用场景: 该框架可以很方便的下载单个文件,并且显示各种状态,包括开始下载,下载中,下载失败,删除等状态. 也可以实现常见的需要下载功能应用,比如:某某手机助手,在该应用内可以说是下载是核心功能,所以对框架的稳定性,代码

Android多线程下载断点续传

先上图看卡结果: GITHUB:Android多线程下载断点续传 如图所示点击下载就开始下载,点击停止就会停止再次点击下载就会接着下载了. 设计思路是这样的: 首先通过广播将下载信息传递给DownService,DownService根据文件URL获取文件大小,再通过DownTask将下载任务分配,并且通过广播当点击停止下载时将下载进度保存在数据库中,当点击开始下载时再从数据库中获取到保存的进度,继续下载. 代码结构: 核心类是 DownLoadService,java 和DownTask.ja

多线程下载文件,以及断点下载

一:前言 多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢? 二:代码示例 直接给出代码, 2.1.经典代码 两行经典的代码分别为: //设置下载的开始及结束位置 conn.setRequestProperty("Range", "bytes="+start+"-"+end+""); //设置读写的起点位置 R

android --多线程下载

多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 RandomAccessFile file = new RandomAccessFile("QQSetup.exe","rwd"); file.setLength(filesize);//设置本地文件的长度 (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为

最新---java多线程下载文件

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { // 定义线程个数 public static int threadCount = 5; public static void main(String[] args) throws Exception { // 1,连接到服务