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网络限制功用。
- 官网:ydxlt.github.io/okdownloade…
- 代码仓库:github.com/ydxlt/okdow…
目前下载结构已接入线上 App 中运用,欢迎大佬吐槽点赞,如果您觉得OkDownloader好用或许该文章对你有协助的话无妨动动你的手指给个Star~感谢您的阅览和支撑!