Сопрограммы, работающие в главном потоке вместо фона - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть приложение, в котором пользователь выбирает 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-файл большой.Я также попробовал AsyncTask и попытался выполнить преобразование в методе doInBackground, но я столкнулся с той же проблемой

1 Ответ

0 голосов
/ 24 февраля 2019

Если вы используете что-то вроде 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.
}
...