Сопрограммы, работающие в главном потоке вместо фона

У меня есть приложение, в котором пользователь выбирает 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.
}
Другие вопросы по тегам