Foros del Web » Programando para Internet » Android »

Problema con una variable devuelta por un método

Estas en el tema de Problema con una variable devuelta por un método en el foro de Android en Foros del Web. Buenas. tengo un método en una clase java que uso en mi app Android. Este método tiene que devolver una variable "result" que nos indica ...
  #1 (permalink)  
Antiguo 14/04/2016, 01:40
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Problema con una variable devuelta por un método

Buenas. tengo un método en una clase java que uso en mi app Android. Este método tiene que devolver una variable "result" que nos indica si la petición mediante okhttp3 es correcta o no. El problema es que la primera vez que llamo a ese método me devuelve el valor inicial de "result" en vez del mensaje.

************************************************** ****************

static String result="hol";
String post(String url, String... parametros) throws IOException
{

OkHttpClient client = new OkHttpClient();
FormBody.Builder builder = new FormBody.Builder();

builder.add(parametros[0], parametros[1]);
builder.add(parametros[2], parametros[3]);

RequestBody formBody = builder.build();

Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();

Call call = client.newCall(request);
call.enqueue(new okhttp3.Callback()
{

@Override
public void onFailure(Call call, IOException e)
{

Log.e("TAG", "(onFailure) The request was not successful");
}

@Override
public void onResponse(Call call, Response response) throws IOException
{

try
{

if (response.isSuccessful())
{

result = response.body().string();
Log.v("RESPUESTA", "Resultado:" +result);

} else
{

Log.v("TAG", "(onResponse) Was not successful");
}

} catch (IOException e)
{

Log.e("TAG", "Exception caught: ", e);
}
}

});

return result;
}

************************************************** ***************

Ejemplo:
-"result" vale hol.
-La primera vez que llamo a este método me devuelve hol en vez del mensaje de existe o no.
-La segunda vez me devuelve e mensaje original.

Por más vueltas que le he dado no se donde esta el problema, espero que puedan ayudarme, un saludo y muchas gracias.

P.D: Si "result" no la inicializo a nada, me devuelve vacío todo el rato.
  #2 (permalink)  
Antiguo 14/04/2016, 02:05
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con una variable devuelta por un método

Mi principal pregunta es....

porque creas un método que devuelve un string (cuando simplemente quieres decir si ha ido bien o no y podrías usar un bool) y lo que haces en el método es modificar una variable general estática para darle el valor y luego también devolverlo?

Código:
result = response.body().string();
Para facilitar la lectura del código mira de formatearlo con las etiquetas que tienes a tu disposición.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 14/04/2016, 02:16
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Respuesta: Problema con una variable devuelta por un método

Gracias por responder e intentaré solucionar lo del código perdón.

Ese método lo creo porque luego lo llamo en la activity principal para que acceda a una API que he creado la cuál tiene un método para comprobar que el teléfono y el correo introducidos no estén en la base de datos (un login).

Si no están, devuelve el mensaje de que no existe y nos envía por correo un código. Si existe debe devolver que ya existe en la base de datos.

Esos dos mensajes son los que debe almacenar la variable "result" y mostrarlos en un Toast.

Sobre la variable estática, era por probar a ver si de esa forma funcionaba. Anteriormente y ahora otra vez es un String normal jaja.
  #4 (permalink)  
Antiguo 14/04/2016, 02:19
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con una variable devuelta por un método

Cuando tengas corregido lo que te comentaba sube de nuevo el código y le volvemos a dar un vistazo.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 14/04/2016, 02:29
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Problema con una variable devuelta por un método

Lo he vuelto a subir esta vez mucho más claro, perdón por las molestias jaja

************************************************** ****************

Código HTML:
static String result="hol";
String post(String url, String... parametros) throws IOException
{
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();

        builder.add(parametros[0], parametros[1]);
        builder.add(parametros[2], parametros[3]);

        RequestBody formBody = builder.build();

        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        Call call = client.newCall(request);
        call.enqueue(new okhttp3.Callback()
        {

            @Override
            public void onFailure(Call call, IOException e)
            {

                Log.e("TAG", "(onFailure) The request was not successful");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {

                try
                {

                    if (response.isSuccessful())
                    {

                        result = response.body().string();
                        Log.v("RESPUESTA", "Resultado:" +result);

                    } else
                    {

                        Log.v("TAG", "(onResponse) Was not successful");
                    }

                } catch (IOException e)
                {

                    Log.e("TAG", "Exception caught: ", e);
                }
            }

        });

        return result;
}
************************************************** ***************
  #6 (permalink)  
Antiguo 14/04/2016, 02:38
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con una variable devuelta por un método

Pero sigue con los fallos que te comenté antes
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 14/04/2016, 02:44
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Problema con una variable devuelta por un método

Ya he quitado lo de static pero sigue el mismo problema
************************************************** ****************

Código HTML:
String result="hol";
String post(String url, String... parametros) throws IOException
{
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder builder = new FormBody.Builder();

        builder.add(parametros[0], parametros[1]);
        builder.add(parametros[2], parametros[3]);

        RequestBody formBody = builder.build();

        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        Call call = client.newCall(request);
        call.enqueue(new okhttp3.Callback()
        {

            @Override
            public void onFailure(Call call, IOException e)
            {

                Log.e("TAG", "(onFailure) The request was not successful");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {

                try
                {

                    if (response.isSuccessful())
                    {

                        result = response.body().string();
                        Log.v("RESPUESTA", "Resultado:" +result);

                    } else
                    {

                        Log.v("TAG", "(onResponse) Was not successful");
                    }

                } catch (IOException e)
                {

                    Log.e("TAG", "Exception caught: ", e);
                }
            }

        });

        return result;
}
************************************************** ***************
  #8 (permalink)  
Antiguo 14/04/2016, 02:58
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con una variable devuelta por un método

Sigues con los problemas que te comenté inicialmente:
- Dentro de la función estás modificando la variable result
- El método está devolviendo la variable "externa" result como resultado.
- Si el método ha de devolver si funcionó o no, con un resultado booleano ya tienes más que suficiente.

Es urgente resolver los dos primeros puntos.
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 14/04/2016, 03:07
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Problema con una variable devuelta por un método

No puede ser una variable booleana ya que en el método onResponse en el if que comprueba que la petición ha sido correcta no me serviría saber simplemente que ha sido correcta ya que si la consulta falla o sale bien, ese método daría true y yo necesito saber si ha fallado o lo ha hecho bien por eso lo del mensaje.

También con ese mensaje quiero comprobar que si manda el mensaje de que ha salido bien me lleve a otra activity y si es mal no.

Respecto a que la variable result este fuera, he probado a meterla dentro del método pero me da un error AndroidStudio el cuál me dice que esa variable debe ser final, pero si la pongo final, me da un error ya que una variable final no se le puede asignar otro valor diferente al inicial.
  #10 (permalink)  
Antiguo 14/04/2016, 03:17
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Problema con una variable devuelta por un método

Es un error muy grande y muy grave modificar así variables: desde un método acceder y modificar una variable externa. Porque no puedes controlar su valor (ni su ciclo de vida) y si se modifica desde otro sitio no vas a poder controlarlo y tendrás errores fantasma.

Además así siempre tendrás control sobre lo que estás devolviendo. Ahora mismo devuelves una variable ya inicializada y existente. Si en algún punto de tu código (una de las ramas de tus condicionales) no le estás asignado un valor, la función devolverá el valor que ya tenía. Esto es exactamente lo que te está pasando. Tu código entra en una rama donde no se modifica el valor de la variable y por eso devuelve el valor anterior.

Ahora no tengo disponible AndroidStudio pero estoy seguro que se puede hacer ese método sin la chapuza de modificar una variable externa. Es un muy mal hábito de programa y estoy seguro que debe haber una forma de hacerlo bien.

Por cierto, cuando has de devolver un rango de valores para indicar el estado de una operación, no se usa un string, se usa un enumerado.
__________________
Aviso: No se resuelven dudas por MP!
  #11 (permalink)  
Antiguo 14/04/2016, 03:22
Avatar de Luisda  
Fecha de Ingreso: octubre-2015
Ubicación: Villanueva de la Reina
Mensajes: 33
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Problema con una variable devuelta por un método

Muchas gracias por tu ayuda intentaré hacerlo de otra forma y perdón por esos errores pero es que soy novato, intentaré solucionarlo a partir de ahora.

Etiquetas: api
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:20.