协同程序在主线程而不是背景上运行

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

我有一个应用程序,用户从文件资源管理器中选择pdf,然后我需要将该pdf转换为base 64。

以下是我将pdf转换为base64的代码

private fun convertImageFileToBase64(imageFile: File?): String {
        return FileInputStream(imageFile).use { inputStream ->
            ByteArrayOutputStream().use { outputStream ->
                Base64OutputStream(outputStream, Base64.DEFAULT).use { base64FilterStream ->
                    inputStream.copyTo(base64FilterStream)
                    base64FilterStream.flush()
                    outputStream.toString()
                }
            }
        }
    }

所以在我收到pdf文件的onActivityResult中,我正在编写以下代码

launch {
    withContext(Dispatchers.IO) {
        generatedBase64 = convertImageFileToBase64(file)
    }

    //upload generatedBase64 to server
}

但代码运行在主线程而不是后台线程上,如果pdf文件很大,我的ui会冻结一段时间。我也试过AsyncTask并尝试在doInBackground方法中执行转换,但我面临同样的问题

android kotlin coroutine kotlinx.coroutines kotlin-coroutines
1个回答
2
投票

如果您使用像Dispatchers.Main + Job()这样的上下文来启动协程,那么在您将注释“upload generatedBase64 to server”的位置它将在主线程上运行。你需要像调用convertImageFileToBase64函数那样切换上下文来将generatedBase64上传到服务器,即使用withContext(Dispatchers.IO)

launch {
    withContext(Dispatchers.IO) {
        generatedBase64 = convertImageFileToBase64(file)
        //upload generatedBase64 to server here
    }
    // do UI stuff here, e.g. show some message, set text to TextView etc.
}
© www.soinside.com 2019 - 2024. All rights reserved.