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