作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个应用程序,其中用户从文件资源管理器中选择一个 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 文件很大,我的用户界面会卡住一段时间。我还尝试了 AsyncTask 并尝试在 doInBackground
方法中执行转换,但我面临同样的问题
最佳答案
如果您使用类似 Dispatchers.Main + Job()
的内容作为启动协程的上下文,那么在您有注释“将生成的 Base64 上传到服务器”的地方,它将在主线程上运行.您需要像调用 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.
}
关于android - 协程运行在主线程而不是后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848836/
我是一名优秀的程序员,十分优秀!