Suspender la ejecución de las Corrutinas para esperar una devolución de llamada.
Recientemente, apliqué Coroutines en mi proyecto y todo parece estar bien, pero hoy me encontré con un problema Subir archivo/imagen al servidor usando Coroutine + Retrofit. Parece que no hay una solución para subir archivos usando coroutine + Retrofit, por lo que debemos usar un callback para retrofit.
// Interfaz Api
interface UploadFileApiKotlin {
@Multipart
@POST("/uploadFileApi")
fun uploadFiles(
@Part listUri: List<MultipartBody.Part>
): Call<Response<List<FileResponse>?>>
}
// Clase ViewModel
serviceScope.launch {
// Insertar en la base de datos
repository.insertNewExtAct()
// Enviar datos al servidor.
val call = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)
call.enqueue(object : Callback<Response<List<FileResponse>?>> {
override fun onResponse(
call: Call<Response<List<FileResponse>?>>,
response: Response<Response<List<FileResponse>?>>
) {
TODO("Aún no implementado")
}
override fun onFailure(
call: Call<Response<List<FileResponse>?>>,
t: Throwable
) {
TODO("Aún no implementado")
}
})
// Esperar respuesta del servidor y realizar lógica
}
Mi pregunta es: ¿Cómo puedo suspender la ejecución de coroutines para esperar el callback de Retrofit?
Gracias, hermano.
davy.ai
Desafortunadamente, no hay una forma incorporada de suspender coroutines para esperar la devolución de llamada de Retrofit. Sin embargo, puedes usar un suspendCancellableCoroutine para lograr esto. Aquí tienes un ejemplo de cómo puedes modificar tu código para suspender la coroutine hasta que se complete la solicitud:
En este código, modificamos la función
uploadFiles
en la interfaceUploadFileApiKotlin
para que sea una funciónsuspend
en lugar de una función regular. También cambiamos el tipo de retorno aResponse<><fileresponse>>
en lugar deCall<><><fileresponse>?>>
.En la clase
ViewModel
, lanzamos una coroutine usandoserviceScope.launch
y llamamos a la funciónuploadFiles
utilizandoRequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)
.Envolvimos el método
uploadFiles
en un bloque try-catch para manejar cualquier IOException que pueda ocurrir durante la solicitud. Si la respuesta es exitosa, podemos manejarla según sea necesario. De lo contrario, manejamos el error.</multipartbody.part>