我有一个应用程序,用户从文件资源管理器中选择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
方法中执行转换,但我面临同样的问题
如果您使用像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.
}