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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。