es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    private fun apiCall(context: Context, callback: (String) -> Unit) {
        val url = "https://example.com"
        val queue = Volley.newRequestQueue(context)
    
        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
                    val day = jsonObject.getString("day")
                    Log.d("notification", "funcionó: $response, $day")
                    callback(day)
                } else{
                    val defaultDay = context.getString(R.string.si_no_hay_dia_especial)
                    Log.d("notification", "funcionó sin día especial: $response, $defaultDay")
                    callback(defaultDay)
                }
            },
            {response ->
                Log.d("notification", "error en la solicitud: $response")
                callback("")
            })
        queue.add(jsonArrayRequest)
    }
    

    Y así es como se puede llamar a la función modificada:

    private fun makeWebRequest(message: String) {
        apiCall(this) { day ->
            Log.d("notification", "solicitud completa: $day")
            // Utiliza la variable day aquí
        }
    }
    

    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ámetro day como cadena. De esta manera, puedes manejar la respuesta de manera asíncrona y esperar a que llegue antes de devolverla.

Comments are closed.