0

我想通过一个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

4

1 回答 1

1

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

于 2022-01-20T08:11:13.750 回答