Skip to content

lanlinju/simple-download

Repository files navigation

simple-download

基于协程和Flow实现的文件下载,支持普通下载、分片下载、多线程下载、断点续传和m3u8类型文件下载

基本使用

// 创建下载任务
val downloadTask = coroutineScope.download("url")

// 监听下载进度
downloadTask.progress()
.onEach { progress ->  /* 更新进度 */  }
.launchIn(lifecycleScope)

// 开始下载
downloadTask.start()

监听下载状态

downloadTask.state().onEach { state ->
    when (state) {
        is State.None -> text.value = "下载"
        is State.Waiting -> text.value = "等待中"
        is State.Downloading -> {
            text.value = state.progress.percentStr()
            // 更新进度
            progress.value = state.progress.progress()
        }
        is State.Failed -> text.value = "重试"
        is State.Stopped -> text.value = "继续"
        is State.Succeed -> text.value = "完成"
    }
}.launchIn(lifecycleScope)

创建下载任务

后台下载

使用GlobalScope.download(url)创建后台下载任务,同时DownloadTask可以多个页面之间共享,通过url进行标识

// 创建后台下载任务
val downloadTask  = GlobalScope.download("url")

// 多页面共享, url相同返回同一个DownloadTask
// 1. 第一个页面中
val task1  = GlobalScope.download("http:xxx.sample_url.com")
// 2. 第二个页面中
val task2  = GlobalScope.download("http:xxx.sample_url.com")
// 两个页面中DownloadTask是相同的,即 task1 == task2,可以在任意多个页面中共享同一个下载进度和下载状态

生命周期绑定

  1. 将下载任务与Activity的生命周期绑定,当Activity销毁的时候自动结束下载任务
//activity销毁时,该下载任务自动停止
val downloadTask = lifecycleScope.download("url")
downloadTask.start()
  1. 将下载任务与可组合函数的生命周期绑定,退出组合时结束下载任务
@Composable
fun DownloadScreen() {
    // 该 CoroutineScope 绑定到调用它的组合点。调用退出组合后,作用域将取消
    val scope = rememberCoroutineScope()
    val downloadTask = remember { scope.download("url") }
}
  1. 将下载任务与ViewModel的生命周期绑定
val downloadTask = viewModelScope.download("url")

启动与停止

// 开始下载
downloadTask.start()
// 停止下载
downloadTask.stop()
// 删除下载
downloadTask.remove()

DEMO

参考开源

本项目是在DownloadX的基础上进行开发的,增加了对M3u8类型文件的下载支持

About

简单的文件下载,支持普通下载、分片下载、多线程下载、断点续传和m3u8类型文件下载

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages