【发布时间】:2021-12-26 03:34:06
【问题描述】:
我正在尝试从下载文件的函数中返回布尔值。 但是在进度处理程序中,我无法将“true”语句返回给函数。
我发现一些文章附加了一个接口以进行通信,但不幸的是我无法让这个 okhttpd 函数工作。
还有其他选择吗?这是我正在使用的代码。
private fun downloadFile(url: String,key: String):Boolean {
val formBody: RequestBody = FormBody.Builder()
.add("key", key)
.build()
val downloadClient = OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(180, TimeUnit.SECONDS).readTimeout(180, TimeUnit.SECONDS)
.build()
val request: Request = Request.Builder()
.url(url)
.post(formBody)
.addHeader("typeAttach", "download")
.build()
downloadClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.e("failure Response", e.toString())
call.cancel()
}
override fun onResponse(call: Call, response: Response) {
val tmpDl = File(globalPath, Utility.tmpDir + "/test.zip")
val sourceBytes = response.body!!.source()
val sourceSize = response.body!!.contentLength()
val sink: BufferedSink = tmpDl.sink().buffer()
var totalRead: Long = 0
var lastRead: Long
while (sourceBytes
.read(sink.buffer, 8L * 1024)
.also { lastRead = it } != -1L
) {
totalRead += lastRead
sink.emitCompleteSegments()
Log.d("progress”, totalRead + "/" + sourceSize)
}
//return true when its finished
sink.writeAll(response.body!!.source())
sink.close()
}
})
return false
}
【问题讨论】:
-
你对返回的布尔值做了什么?
-
您的问题与您所看到的使用接口的问题相比没有什么不同,它也应该在这里工作,只需在
onFailure或onResponse中调用回调 -
首先调用该函数是可以的,它不关心结果,这就是为什么它被定义所以你不能返回任何东西。将您的主应用程序想象成一个人在工作,而异步调用就像让其他人去做一项任务。该回调是他们完成后应该做的工作
-
如果你使用协程和挂起函数并在没有入队的情况下点击请求怎么办。否则回调也是一个好方法。
标签: android kotlin asynchronous okhttp