如何通过 Flow 观察 Ktor 下载进度

How to observe Ktor download progress by a Flow

我想通过Flow观察下载进度, 所以我写了一个这样的函数:

suspend fun downloadFile(file: File, url: String): Flow<Int>{
        val client = HttpClient(Android)
        return flow{
            val httpResponse: HttpResponse = client.get(url) {
                onDownload { bytesSentTotal, contentLength ->
                    val progress = (bytesSentTotal * 100f / contentLength).roundToInt()
                    emit(progress)
                }
            }
            val responseBody: ByteArray = httpResponse.receive()
            file.writeBytes(responseBody)
        }
}

但是onDownload只会被调用一次,文件不会被下载。如果我删除 emit(progress) 它将起作用。

io.ktor:ktor-client-android:1.6.7

使用 callbackFlow 而不是 flow。常规流程无法启动后台代码,只能从流程本身内部的代码发出值。同时,回调流可以在后台启动其他工作,然后接收来自它的回调。