Сопрограммы, работающие в главном потоке вместо фона
У меня есть приложение, в котором пользователь выбирает PDF-файл из проводника, а затем мне нужно преобразовать этот PDF-файл в базу 64.
Ниже приведен мой код для преобразования PDF в Base 64
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 большой. Я также попытался AsyncTask и попытался выполнить преобразование в doInBackground
метод, но я сталкиваюсь с той же проблемой
1 ответ
Если вы используете что-то вроде Dispatchers.Main + Job()
в качестве контекста для запуска сопрограммы, то в месте, где у вас есть комментарий "загрузить созданный BaseB64 на сервер", он будет запущен в главном потоке. Вам нужно переключать контексты, как вы это сделали для вызова 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.
}