• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

OkDownloader, OkHttp的现代化开源下载框架

武飞扬头像
异独行
帮助5

OkDownloader是一款基于 OkHttp 编写的适用于Kotlin/Java/Android平台的开源下载框架,可以运行在任何JVM 机器上。

  • 简单易用:和 OkHttp 一样简单易用的 API
  • 功能丰富:支持同步/异步下载、网络限制、任务优先级、资源校验、多线程下载等
  • 现代化:用 Kotlin 编写的基于 OkHttp 的下载框架
  • 易扩展:支持在代码中注入自定义拦截器以及SPI声明自定义拦截器的方式扩展下载功能
  • 多平台:支持在任何 JVM 机器上运行

使用示例

创建Downloader对象

val downloader = Downloader.Builder().build()

同步下载

val request = Download.Request.Builder()
    .url(url)
    .into(file)
    .build()
downloader.newCall(request).execute()

异步下载

val request = Download.Request.Builder()
    .url(url)
    .into(file)
    .build()
downloader.newCall(request).enqueue()

取消下载

call.cancel()

更多的用法可以参考文章最后的官网

设计思路

OkDownloader 整体上模仿 OkHttp 的代码风格和模式编写,拥有和 OkHttp 一样简单易用的 API和拦截器,这种设计非常容易扩展。

代码添加拦截器

val downloader = Downloader.Builder()
    .addInterceptor(CustomInterceptor())
    .build()

SPI声明拦截器(可以在不同的模块中,通常会在一个扩展模块),即在扩展模块的META-INF/services/com.billbook.lib.Interceptor

com.example.CustomInterceptor1
com.example.CustomInterceptor2
com.example.CustomInterceptor3

Downloader为什么不直接设计成单例?

通常,我们在使用 OkHttp 的时候会将 OkHttpClient 包装成单例。那么为什么OkHttp 不把 OkHttpClient 直接设置成单例呢?

原因是不设计成单例会更加灵活,在需要特殊配置的时候我们调用原有的 OkHttpClient 的 newBuilder 方法重新创建一个 Builder进行特殊的参数配置(如更短的连接超时)后 build一个新的 OkHttpClient 以适应于新的网络请求场景。这样不仅可以进行资源复用(如内部的连接池)还可以特殊定制化以便适应多个网络请求场景。

资源复用

类似地,Downloader对象中有一个 ExecutorService,是内部异步下载任务调度执行的线程池。通常我们需要进行线程池的复用,所以 Downloader 也提供了 newBuilder 方法进行资源的复用。同时 Downloader 对象中会有自己的 DownloadPool,我们称它为下载池,它的职责是管理 Downloader 中的所有下载任务。Downloader 的 DownloadPool 不会进行复用,目的是为了对不同 Downloader 的下载任务隔离。

任务隔离

每个Downloader 实例有自己的DownloadPool,这样方便进行下载任务隔离,做到不同业务的下载任务互不干扰。

当然,如果你需要的是全局的Downloader统一管理App 的所有下载任务,那么你可以将 Downloader 包装成单例对象,并且设置同一个下载池,如

val downloadPool = DownloadPool()

val globalDownloader = Downloader.Builder()
    .downloadPool(downloadPool)
    .build()

val retry10Downloader = globalDownloader.newBuilder()
        .downloadPool(downloadPool)
        .defaultMaxRetry(10)
        .build()
       
// cancelAll
globalDownloader.cancelAll()

需要说明的是,当你需要特殊配置一个 Downloader 对象,并且你需要将该 Downloader 中的任务在全局 Downloader调用 cancelAll 时也会取消它的下载任务的时候你才需要设置同一个 DownloadPool。

最后

OkDownloader提供了和 OkHttp 类似的简单易用的 API,很方便使用。同时也提供了拦截器很方便对现有的功能进行扩展,如可扩展免流 Url转换功能,4G或WIFI网络限制功能。

目前下载框架已接入线上 App 中使用,欢迎大佬吐槽点赞,如果您觉得OkDownloader好用或者该文章对你有帮助的话不妨动动你的手指给个Star~感谢您的阅读和支持!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfgkijk
系列文章
更多 icon
同类精品
更多 icon
继续加载