Tengo una aplicación en la que el usuario elige un pdf del explorador de archivos y luego necesito convertir ese pdf a base 64.
El siguiente es mi código para convertir pdf a 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() } } } }
entonces en onActivityResult
donde obtengo el archivo pdf, estoy escribiendo el siguiente código
launch { withContext(Dispatchers.IO) { generatedBase64 = convertImageFileToBase64(file) } //upload generatedBase64 to server }
Pero el código se ejecuta en el subproceso principal en lugar del subproceso de fondo y mi interfaz de usuario se congela durante algún tiempo si el archivo pdf es grande. También probé AsyncTask e intenté realizar la conversión en el método doInBackground
pero me enfrento al mismo problema
Si usa algo como Dispatchers.Main + Job()
como contexto para iniciar la corrutina, en el lugar donde tiene el comentario "cargar base64 generada en el servidor", se ejecutará en el hilo principal. Debe cambiar los contextos como lo hizo para invocar la función convertImageFileToBase64
para cargar la Base64 generatedBase64
en el servidor, es decir, use withContext(Dispatchers.IO)
:
launch { withContext(Dispatchers.IO) { generatedBase64 = convertImageFileToBase64(file) //upload generatedBase64 to server here } // do UI stuff here, eg show some message, set text to TextView etc. }