Android 多线程下载文件原理霸气解析介绍 (1)

本文深入探讨Android多线程下载的原理,重点关注Transfer-Encoding: chunked和Content-Length字段。内容包括:1) chunked编码在HTTP响应中的作用及无法获取文件总长度的问题;2) content-length字段对于多线程下载的重要性;3) Range头在断点续传中的应用。此外,还讨论了如何处理没有content-length的情况,以及如何跟踪下载进度。
摘要由CSDN通过智能技术生成

*这节我只给大家介绍想要学会多线程下载必须掌握的相关原理!

无论是多线程下载,还是断点续传等复杂的功能,都需要先了解原理,遇到的问题。下面上图介绍一下。

这里写图片描述

逐个介绍一下。

http相关字段 :
1、Transfer-Encoding:chunked: 这个字段很重要,从字面意义上讲这是客户端接收传输的编码方式。这种编码方式的意思是,我们前段在展示一个比较大的内容的时候,服务器不是一次性把数据传过来的(一次性比较耗时),而是一块一块的传过来,这时候采用的就是“Transfer-Encoding:chunked”编码方式,而这样会有一个问题,就是在http响应头里面就会拿不到这个文件的总长度。“content-length”返回值是 -1。后面我会贴上代码,和解决方法。

2、content-length : 作用在响应头中的数据。它可以拿到这个文件的总长度,这个就可以多线程分配每个线程下载多少。 这个字段很重要。 而如果此时数据是“Transfer-Encoding:chunked:” 那么会拿不到文件的总长度,返回值是 -1。 一般静态的文本文件、图片等都是可以拿到的,最终能不能拿到取决于服务器

3、Range : 它可以访问服务器中某一个数据制定长度的内容。比如我们在多线程下载的时候,已经下载了一部分保存到本地了,然后我们第二次打开重新下载的时候,我们就可以通过Range指定可以从多少个字节接着下载。

多线程工作原理:
这里写图片描述

需要解决的问题:
这里写图片描述

下面给大家介绍了解一下多线程下载必须得到参数”文件的总长度 content-length“。

1、访问服务器,获取不到 ”文件的总长度 content-length“ 案例
访问www.qq.com ,它就是Transfer-Encoding:chunked 编码方式,一块一块传输的,不能文件总长度,代码如下,看一下。

 public static void main(String args[]) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url("http://www.qq.com").
                build();
        try {
            Respon
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值