协程在主线程而不是后台上运行

时间:2019-02-24 04:48:34

标签: android kotlin coroutine kotlinx.coroutines kotlin-coroutines

我有一个应用程序,用户在其中从文件资源管理器中选择一个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()
                }
            }
        }
    }

因此在onActivityResult中获取pdf文件的位置,我正在编写以下代码

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

    //upload generatedBase64 to server
}

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

1 个答案:

答案 0 :(得分:2)

如果将Dispatchers.Main + Job()之类的内容用作启动协程的上下文,则在注释“将GeneratedBase64上载到服务器”的地方,它将在主线程上运行。您需要像调用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.
}