OkHttp3使用解析:实现下载进度的监听及其原理简析

前言

本篇文章主要介绍如何利用OkHttp3实现下载进度的监听。其实下载进度的监听,在OkHttp3的官方源码中已经有了相应的实现(传送门),我们可以参考它们的实现方法,并谈谈它们的实现原理,以便我们更好地理解。

引入依赖

笔者在写下这篇文章的时候,OkHttp已经更新到了3.6.0:

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.6.0'
}

下载进度监听的实现

我们知道,OkHttp把请求和响应分别封装成了RequestBody和ResponseBody,举例子来说,ResponseBody内部封装了响应的Head、Body等内容,如果我们要获取当然的下载进度,即传输了多少字节,那么我们就要对ResponseBody做出某些修改,以便能让我们知道传输的进度以及设置相应的回调函数供我们使用。因此,我们先来了解一下ResponseBody这个类(RequestBody同理),它是一个抽象类,有着三个抽象方法:

public abstract class ResponseBody implements Closeable {
   
    //返回响应内容的类型,比如image/jpeg
    public abstract MediaType contentType();
    //返回响应内容的长度
    public abstract long contentLength();
    //返回一个BufferedSource
    public abstract BufferedSource source();

    //...
}

前面两个方法容易理解,那么第三个方法怎样理解呢?其实这里的BufferedSource用到了Okio,OkHttp的底层流操作实际上是Okio的操作,Okio也是square的,主要简化了Java IO操作,有兴趣的读者可以查阅相关资料,这里不详细说明,只做简单分析。BufferedSource可以理解为一个带有缓冲区的响应体,因为从网络流读入响应体的时候,Okio先把响应体读入一个缓冲区内,也即是BufferedSource。知道了这三个方法的用处后,我们还应该考虑的是,我们需要一个回调接口,方便我们实现进度的更新。我们继承ResponseBody,实现ProgressResponseBody:

public class ProgressResponseBody extends ResponseBody {
   

    //回调接口
    interface ProgressListener{
        /**
         * @param bytesRead 已经读取的字节数
         * @param contentLength 响应总长度
         * @param done 是否读取完毕
         */
        void update(long bytesRead,long contentLength,boolean done);
    }

    private final ResponseBody responseBody;
    private
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值