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

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

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

使用示例

创建Downloader对象

kotlin 复制代码
val downloader = Downloader.Builder().build()

同步下载

kotlin 复制代码
val request = Download.Request.Builder()
    .url(url)
    .into(file)
    .build()
downloader.newCall(request).execute()

异步下载

kotlin 复制代码
val request = Download.Request.Builder()
    .url(url)
    .into(file)
    .build()
downloader.newCall(request).enqueue()

取消下载

kotlin 复制代码
call.cancel()

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

设计思路

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

代码添加拦截器

kotlin 复制代码
val downloader = Downloader.Builder()
    .addInterceptor(CustomInterceptor())
    .build()

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

kotlin 复制代码
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 包装成单例对象,并且设置同一个下载池,如

scss 复制代码
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~感谢您的阅读和支持!

相关推荐
大强同学28 分钟前
CloudFlare-ImgBed+HuggingFace图床搭建教程
windows·github·图床搭建
T_Fire_of_Square2 小时前
crewai的进一步工具扩展
python·github
明洞日记2 小时前
【软考每日一练015】计算机网络:DNS 递归查询与迭代查询解析
git·计算机网络·github
无限进步_16 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
烟锁池塘柳020 小时前
GitHub 强制回退版本并覆盖远程仓库
git·github
Maggie_ssss_supp1 天前
Linux-MySQL主从复制
github
cg50171 天前
Continue插件实现本地部署一个“cursor”或“github copilot”
github·copilot·curcor
妙娲种子1 天前
gittee连接github镜像
gitee·github
无限进步_1 天前
C语言实现贪吃蛇游戏完整教程【最终版】
c语言·开发语言·c++·git·游戏·github·visual studio
CoderJia程序员甲1 天前
GitHub 热榜项目 - 日榜(2026-01-21)
ai·开源·大模型·github·ai教程