安卓中多线程断点续传文件下载核心代码总结

Android 中实现多线程下载和断点续传的原理和代码 在上一章,用Java代码实现了 多线程下载和断点续传, 现在我们将它移植到 Android 上面.下面这个类能帮助我们实现多线程下载和断点续传功能. 介绍一下这个类的使用方法.快速下载 1. 该类的构造方法需要提供三个参数. 2. public MuchThreadDown(String path, String targetFilePath, int threadCount) 阅读详情

最近学习了Android多线程断点续传,这里做个小小的总结,我觉得下载的几处关键:创建临时文件并计算每个线程需要下载的部分size,每个线程需要下载的开始和结束startIndex和endIndexe,使用获取的流的长度除以size就得到了每个线程需要下载的部分大小,但是如果除不尽的都留给最后一个线程来下载,

然后就是保证断点续传的机制,使用的是临时文件来存放每个线程下载的进度,每次开始都会判断一下临时文件是否存在,以及记录的对应的线程下载记录,根据记录开始本次下载,判断每个线程是否下载完毕,若果都下载完毕则通过循环删除临时文件,

具体下载过程,再次获取连接,根据206的状态码获取读取流,然后就是Java中的io读写的过程了,需要用到的RandomAccessFile来实现临时文件的创建和写入,简单说是因为每个线程请求的部分不同,因而写入的时候也不是从零开始写的,而RandomAccessFile的seek方法,支持写入时的定位,也就是 在指定位置写入文件,然后几个部分拼凑起来就是完成的要下载的文件了。

此外还有需要注意的细节,比如请求网络的代码要放在子线程中来实现,但是更新进度条棒的操作需要在主线程中来实现,因为主线程中不可以做耗时的操作,另外,将线程当前的下载进度写入到文件的过程需要放在随机写入流的后面来执行,避免意外的中断导致文件中产生了记录而随机访问流还没有来得及写入的情况!

public class Demo {
	static String path = "http://192.168.1.106:8080/OneKey.exe";
	static int THREAD_COUNT = 3;
	static int count = 0;
	/**
	 * 分析:多线程下载的思路
	 * 1.首先要有一个访问的地址,根据该地址建立一次连接,
	 * 2.通过建立的连接返回的状态行来设置本地临时文件的大小,并且根据path获取文件名
	 * 3.多个线程下载,所以要计算出每个线程需要下载的数据大小,计算每个线程的开始和结束位置,以确定每个线程请求下载的范围。
	 * 4.打开本地临时文件流,设置每个线程写入本地临时文件的开始位置,和每个线程的请求范围
	 * 5.获取流,读取,写入到临时文件
	 */
	public static void main(String[] args){
		
		
		try {
			URL url = new URL(path);
			HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();
			openConnection.setReadTimeout(8*1000);
			openConnection.setConnectTimeout(8*1000);
			openConnection.setRequestMethod("GET");
			if(openConnection.getResponseCode() == 200){
				int Length = openConnection.getContentLength();
				RandomAccessFile raf = new RandomAccessFile(new File(getFileNameFromPath(path)), "rwd");
				raf.setLength(Length);
				raf.close();
				//计算每个线程需要下载的部分
				int size = Length/THREAD_COUNT;
				for(int i=0;i<THREAD_COUNT;i++){
					int startIndex = i*size;
					int endIndex = (i+1)*size-1;
					if(i == THREAD_COUNT-1){
						endIndex = Length-1;
					}
					System.out.println("线程"+i+"的下载区间为:"+startIndex+"-"+endIndex);
					new DownLoadThread(startIndex,endIndex,i).start();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static String getFileNameFromPath(String path) {
		int index = path.lastIndexOf("/");
		return path.substring(index+1);
	}
}

class DownLoadThread extends Thread{
	
	private int startIndex;
	private int endIndex;
	private int ThreadID;

	/**
	 * 考虑加上断点续传问题,思路就是定义一个变量记录线程当前下载的总量,
	 * 如果线程中断,下次继续下载的时候,就将记录的这个值传给线程,让线程从这个值
	 * 开始下载,一般保存到临时文件中,下载完毕,文件删除即可。
	 * @param startIndex
	 * @param endIndex
	 * @param ThreadID
	 */
	public DownLoadThread(int startIndex, int endIndex, int ThreadID) {
		super();
		this.startIndex=startIndex;
		this.endIndex=endIndex;
		this.ThreadID=ThreadID;
	}
		
		public void run(){
			try {
				int progress = 0;
				File file = new File(ThreadID+".txt");
				if(file.exists()){
					FileInputStream in = new FileInputStream(file);
					BufferedReader br = new BufferedReader(new InputStreamReader(in));
					progress = Integer.parseInt(br.readLine());
					startIndex +=progress;
					in.close();
					}
				URL url = new URL(Demo.path);
				HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();
				openConnection.setReadTimeout(8*1000);
				openConnection.setConnectTimeout(8*1000);
				openConnection.setRequestMethod("GET");
				//设置每个线程需要下载的部分区间
				openConnection.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);
				if(openConnection.getResponseCode() == 206){
					RandomAccessFile raf = new RandomAccessFile(new File(Demo.getFileNameFromPath(Demo.path)), "rwd");
					raf.seek(startIndex);
					InputStream inputStream = openConnection.getInputStream();
					byte[] b = new byte[1024];
					int len = 0;
					int total = progress;
					while((len = inputStream.read(b))!=-1){
						raf.write(b, 0, len);
						total +=len;
						System.out.println("线程"+ThreadID+"的下载总数为:"+total);
						//这里就需要生成一个记录文件了
						RandomAccessFile rafFile = new RandomAccessFile(file, "rwd");
						rafFile.write((total+"").getBytes());
						rafFile.close();
					}
					System.out.println("线程"+ThreadID+"下载完毕******************************");
					raf.close();
					
					Demo.count++;
					synchronized (Demo.path) {
						if(Demo.count == 3){
							for(int i=0;i<Demo.count;i++){
								File f = new File(i+".txt");
								f.delete();
							}
						}
					}
					
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		
	
}

Android多线程断点续传下载原理及实现 这段时间看了看工作室的工具库的下载组件,发现其存在一些问题: 1.下载核心逻辑有 bug,在暂停下载或下载失败等情况时有概率无法顺利完成下载。 2.虽然原来的设计是采用多线程断点续传的设计,但打了一下日志发现其实下载任务都是在同一个线程下串行执行,并没有起到加快下载速度的作用。 考虑到原来的代码并不复杂,因此对这部分下载组件进行了重写。这里记录一下里面的多线程断点续传功能的实现。 更多完整项... 阅读详情

相关推荐

安卓M3U8多线程批量下载神器

本文详细介绍安卓M3U8多线程批量下载神器的核心功能与使用技巧。该工具针对M3U8视频格式深度优化,支持智能断点续传、多线程加速和批量下载管理,大幅提升下载效率和稳定性,是教育学习、媒体素材收集和个人娱乐的得力助手。

d6e7f8的博客 1051

Android文件下载——多线程断点下载

1. 前言     在前面的博客中简单实现了Android单线程断点下载以及Android文件多线程下载,这篇将实现多线程断点下载。对于断点下载,我们知道主要是为了实现不重复下载上次下载过的数据文件内容,而和前面实践的区别在于我们将从单线程环境拓展到多线程环境中。下面简单整理下思路。 2. 设计思路 确定多线程环境下的线程数量; 确定每个线程自己所需要下载的数据范围; 每个线程下载的数据,使用临时文件进行存储,最终进行文件合并。 (测试结果发现合并太耗时了,故而不考虑使用临时文件的方式。) 记录每个线程下

梦否 1832

Android网络多线程断点续传下载实战教程

在了解多线程下载之前,我们先来了解单线程下载的基本原理。单线程下载是指用户设备上的下载客户端与服务器之间建立一个HTTP连接,通过这个连接从服务器下载数据,直到文件下载完成。然而,这种方式受到网络带宽和服务器处理能力的限制,下载速度有限。

weixin_31185473的博客 888

安卓多线程下载

请输入线程的数量请输入下载地址多线程下载暂停下载

cqn2bd2b的博客 637

Android多线程断点续传下载及在线音乐播放指南

本文还有配套的精品资源,点击获取 简介:在Android应用开发中,实现高效且稳定的多线程断点续传下载和在线音乐播放涉及多个关键技术和组件。本文将详细探讨如何通过网络编程、文件操作、多线程处理等技术实现这些功能,以及如何使用网络请求库、线程池、内存管理、多媒体播放、服务、通知和下载管理器等组件,为用户提供无缝的下载和音乐播放体验。 1. Android多线程下载技...

weixin_42581003的博客 872

Android多线程断点续传下载+在线播放音乐

Android多线程断点续传下载+在线播放音乐,我想很多小白都想要。

Android实现网络多线程文件下载

实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度。 (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如下图所示: (网上找的图) 例如10M大小,使用3个线程来下载, 线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下...

dawuafang 467

Android代码-安卓多线程下载

kkdownloader 安卓多线程下载 使用方法如下: //0. listView = (ListView)findViewById(R.id.listView1); final TestAdapter testAdapter = new TestAdapter(); //1.获取DownloadManager实例 建议在application中初始化 final DownloadManager downloadManager = DownloadManager.getInstance(this); //1)a设置数据源为downloadManager.getDownloadThreads(); testAdapter.dataSource = downloadManager.getDownloadThreads(); listView.setAdapter(testAdapter); //2.更新ui 可以调用多次 downloadManager.refreshUI(new Runnable()

Android 的网络编程(16)-网络多线程断点续传下载

我们编写的是Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点。   使用多线程的好处:使用多线程下载会提升文件下载的速度。那么多线程下载文件的过程是:    (1)首先获得下载文件的长度,然后设置本地文件的长度。

love android 3349

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 538

SAP成本核算变式OKKN配置详解:从CK11N到CK24,手把手教你搞定标准成本发布

本文深入解析SAP成本核算变式OKKN的配置原理与实战应用,涵盖从CK11N到CK24的标准成本发布全流程。详细讲解数量结构控制、价值结构配置及间接费用计算规则,帮助成本会计精准掌握标准成本计算逻辑,解决BOM版本选择、工艺路线获取等常见问题,提升企业成本管理效率。

weixin_27219587的博客 285

Android平台下通过HTTP协议实现断点续传下载

我们编写的是Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点。 使用多线程的好处:使用多线程下载会提升文件下载的速度。那么多线程下载文件的过程是:    (1)首先获得下载文件的长度,然后设置本地文件的长度。      HttpURLConnection.

SuperStudet的博客 865

Reality Capture控制点修复/合并模型

通过增加控制点/修改对齐设置参数来修复模型被分为两个部分的解决方法

草履虫建模的博客 5239

Android多线程断点续传

我们编写的是Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能?1.多线程下载,2.支持断点。使用多线程的好处:使用多线程下载会提升文件下载的速度。那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度。 HttpURLConnection.getContentLengt

细心程度决定你的成败 3159

esxi8.0.3如何添加USB外置硬盘

本文介绍了在ESXi系统中配置外置USB硬盘作为数据存储的完整步骤:1)通过SSH禁用USB仲裁服务并关闭自启;2)识别已连接的USB硬盘设备路径;3)使用partedUtil创建GPT分区表并计算扇区范围;4)设置VMFS6分区并格式化。关键命令包括停止usbarbitrator服务、partedUtil分区操作以及vmkfstools格式化命令。整个过程需通过SSH执行,最终将USB硬盘配置为名为"USB_Datastore"的VMFS6存储设备。

qq_41683719的博客 1544

Orbbec-Gemini-335 深度相机 Python SDK 编译与配置全记录(Windows 环境)

本篇博客将围绕 Windows 系统下 Orbbec SDK 的 Python 配置与编译过程进行详细说明,主要使用的是官方提供的 pyorbbecsdk Python wrapper 项目以及 Orbbec SDK V2 Python Wrapper 配置指南,并记录了安装与配置过程中遇到的若干问题及解决办法。

Junseer的博客 1965

多线程下载与断点续传

依赖:compile 'com.loopj.android:android-async-http:1.4.9' 权限: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andr

Lay_y的博客 412

智能化运维(AIOps)

• 调查显示,54.79%的企业当前着重关注智能运维的质量领域(包括异常检测、告警收敛、根因分析、 故障处置等)能力建设,其次45.77%的企业关注效率领域,45.49%的企业关注成本领域,30.82%的 企业关注安全领域。从目前的发展情况来看,现阶段AIOps能力大多集中在L2级别, 主要以系统辅助分析,帮助人工进行决策和操作为主,较为领先的 能力实践可以达到L3级别,而L4和L5级别随着AIOps的技术发展 和能力的逐步增强,将是未来智能运维能力建设的发展方向和目标。

追求更专业的设计 3095

带暂停的断点续传

布局文件 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools=...

augfun的博客 497

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 215

基于C++和Qt开发IEC104规约主站调试软件(第二章)

本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。

半青年的博客 858

Android 多线程下载以及断点续传

在日常开发中,我们不可避免的会接到类似这样的需求,下载一个比较大的素材文件或者安装包文件,以此实现APP的自动更新,APP内的素材替换等。这里其实我们可以记录每一次写入文件的进度,当下载任务被暂停的时候,我们就将对应的任务记录下载,记录相应的url,存储文件,当前下载的进度等基本信息,当用户再次出发的时候我们就可以从这些信息恢复进度,继续下载。获取到对应的内容,那么我们就要在文件的指定区域去写入,由于我们是多线程下载,因此文件并不是每次都是从前往后一个个字节写入的,随时可能在文件的任何一个地方写入数据。

涛的博客 3627

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Aandroid 多线程断点续传同时下载多个大文件

Aandroid 多线程断点续传同时下载多个大文件Aandroid 多线程断点续传同时下载多个大文件最近学习在Android环境中一些网络请求方面的知识,其中有一部分是关于网络下载方面的知识。在这里解析一下自己写的demo,总结一下自己所学的知识。下图为demo的效果图,仿照一些应用下载商城在ListView中列出加载项,然后可以可以下载和停止。 1概述这里有几个比较重要的类DownloadMan

luoshishou的专栏 6009

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android多线程下载文件拆解:原理、实现与优化

在开发需要下载大型文件的应用时,传统单线程下载面临速度瓶颈、断网风险和内存压力等问题。多线程下载技术通过并行下载、断点续传和文件分块写入等方式有效解决这些问题。核心技术包括HTTP Range请求、随机文件访问、线程同步控制和进度监控。实现流程包括检查服务器支持、预分配文件空间、计算分块范围、启动多线程下载和合并文件。代码实现涉及检查服务器支持、文件分块计算和多线程下载核心逻辑。增强功能包括断点续传和动态线程数调整。性能优化测试表明,3-5线程时达到最佳性价比,建议采用动态线程数策略。常见问题包括写入文件错

2508_91837411的博客 1670

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传

OkDownload 是一个为 Android 平台设计的开源下载框架,它支持多线程下载、多任务处理、断点续传等功能,并且具有可靠性、灵活性和高性能的特点。这个库是 FileDownloader 的升级版本,也被称作 FileDownloader2 。要使用 OkDownload,首先需要在项目中添加依赖。可以通过 Maven 或 Gradle 引入 OkDownload 核心库以及 SQLite 和 OkHttp 的相关依赖 。 配置 DownloadTask DownloadTask 提供了多种配置选项

AntDream的程序世界 1917

RandomAccessFile断点续传和多线程断点续传(大文件分段下载)总结

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

2401_84520026的博客 1169
上一篇: 一个题目做了好久,java,想说爱你不容易!
下一篇: Android开发之基础------------测试相关、sdcard操作、SharedPreferences存取
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值