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~感谢您的阅读和支持!

相关推荐
KevinAshen6710 分钟前
用 Go 修复旧下载工具:从接口 403 到凭证截断的完整复盘
go·github
miofly35 分钟前
GitHub 今日推荐|Edge0:让大号 MoE 模型在一台 Mac 上流式跑起来
python·开源·github
shandianchengzi2 小时前
【记录】LLM|ChatGPT连接Github并管理
chatgpt·github
徐小夕2 小时前
JitOffice:把办公、AI 与审批装进同一个平台
前端·vue.js·github
徐小夕2 小时前
万字分享:为什么我们要自研Word解析引擎?JitWord 解析引擎 4.0 深度复盘
前端·vue.js·github
miofly4 小时前
GitHub 日榜趋势速报 | 2026-10-30
开源·github
wflynn13 小时前
GitHub 日榜趋势速报 | 2026-10-28
开源·github
WebInfra19 小时前
Rspack 2.3 发布:联手 SWC 团队带来全新编译器
前端·javascript·github
wflynn19 小时前
GitHub 今日推荐|rea:用 MCP 把反编译器和 AI agent 接到一起的逆向工具
typescript·开源·github·agent·agent-skills·binary-analysis
m4Rk_20 小时前
【论文阅读】Agent记忆机制(114):MemoryTax——当 Agent 能自主搜索历史,专门的记忆系统还划算吗?
论文阅读·人工智能·学习·开源·github