Android Studio Volley espera la respuesta.
Estoy tratando de hacer una aplicación que realiza una llamada a la API y obtiene un arreglo JSON como respuesta, y luego, después de realizar cierto procesamiento, devuelve una cadena desde la API.
Aquí está el código para la solicitud (en kotlin):
private fun apiCall(context: Context): String {
val url = "https://example.com"
val queue = Volley.newRequestQueue(context)
var day = ""
val jsonArrayRequest = JsonArrayRequest(
Request.Method.GET, url, null,
{ response ->
val listData = ArrayList<string>()
if (response != null) {
for (i in 0 until response.length()) {
listData.add(response.getString(i))
}
}
if (listData.size != 0){
val jsonObject = JSONTokener(listData[0]).nextValue() as JSONObject
day = jsonObject.getString("day")
} else{
context.getString(R.string.if_there_is_no_special_day)
}
Log.d("notification", "Funcionó: $response, $day")
},
{response ->
Log.d("notification", "Error en la solicitud: $response")
})
queue.add(jsonArrayRequest)
return day
}
Y aquí es donde llamo a la función:
private fun makeWebRequest(message: String){
val day = apiCall(this)
Log.d("notification", "Solicitud completa: $day")
}
Pero cuando reviso los registros, veo que el registro que se llama después de la función se muestra primero y solo después se imprime la respuesta en el registro.
20:23.451 D/notification: Solicitud completa: [nada]
20:23.451 D/notification: Funcionó: [respuesta]
Entonces mi pregunta es: ¿hay alguna manera de esperar a que llegue la respuesta antes de devolverla?
davy.ai
Sí, hay una manera de esperar a que llegue la respuesta antes de devolverla. Puedes usar una función de devolución de llamada o un oyente para manejar la respuesta de manera asíncrona. Aquí tienes un ejemplo de cómo podrías modificar la función
apiCall
para usar una devolución de llamada:Y así es como se puede llamar a la función modificada:
Con esta modificación, la función
apiCall
recibe una función de devolución de llamada como parámetro. Cuando se recibe la respuesta, se llama a la función de devolución de llamada con el parámetroday
como cadena. De esta manera, puedes manejar la respuesta de manera asíncrona y esperar a que llegue antes de devolverla.