如何通过 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
。常规流程无法启动后台代码,只能从流程本身内部的代码发出值。同时,回调流可以在后台启动其他工作,然后接收来自它的回调。
我想通过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
。常规流程无法启动后台代码,只能从流程本身内部的代码发出值。同时,回调流可以在后台启动其他工作,然后接收来自它的回调。