我当前在尝试使用 OkHttp 下载大文件,然后使用 Kotlin 的 copyTo() 方法将该文件写入我的自定义目标文件位置时遇到 java.lang.OutOfMemoryError 异常。还有更好的选择吗?由于某种原因,我不想使用 Android DownloadManager。这是我的代码:
override suspend fun download(
url: String,
targetFile: File,
onProgressChanged: (Int) -> Unit
) {
if (!targetFile.exists()) {
targetFile.parentFile?.mkdirs()
}
okHttpClient.newCall(
Request.Builder()
.get()
.url(url)
.build()
).execute().body?.let {
startDownload(it.byteStream(), targetFile)
}
}
private suspend fun startDownload(source: InputStream, targetFile: File) =
withContext(Dispatchers.IO) {
source.use { ins ->
ins.copyTo(targetFile.outputStream())
}
}
问题是
java.lang.OutOfMemoryError
,因为您正在尝试下载更大的文件。
基本上,您正在尝试使用
OkHttp
将更大的文件下载到 Android 手机的 RAM 中。这就是问题所在。