我有一个应用程序,用户在其中从文件资源管理器中选择一个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
方法执行转换,但是我也遇到了同样的问题
答案 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.
}