使用 Kotlin 的 copyTo() 时出现 OutOfMemoryError

问题描述 投票:0回答:1

我当前在尝试使用 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())
            }
        } 
android kotlin file okhttp
1个回答
0
投票

问题是

java.lang.OutOfMemoryError
,因为您正在尝试下载更大的文件。

基本上,您正在尝试使用

OkHttp
将更大的文件下载到 Android 手机的 RAM 中。这就是问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.