A continuación es un método en el que estoy tratando de recuperar un objeto de usuario llamando getSelf(). El problema es que el resultado es siempre nulo ya que la Volea petición no ha terminado en el momento de devolver el resultado. Soy un poco nuevo en async procesos, por lo que no estoy seguro de la mejor manera de tener el método de esperar el resultado de la llamada a la API para devolver el UserBean objeto. Puede alguien darme alguna ayuda?

public UserBean getSelf(String url){

    RpcJSONObject jsonRequest = new RpcJSONObject("getSelf", new JSONArray());

    JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.POST, url, jsonRequest, 
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                String result;
                try {
                    result = response.getString("result");
                    Gson gson = new Gson();
                    java.lang.reflect.Type listType = new TypeToken<UserBean>() {}.getType();

                    //HOW DO I RETURN THIS VALUE VIA THE PARENT METHOD??
                    userBean = (UserBean) gson.fromJson(result, listType);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               Log.e("Error:", error.toString());
               finish();
            }
        }
    );

    this.queue.add(userRequest);


    return userBean;

}   
  • Usted no debe hacer lo que estamos tratando de hacer. La razón para asincrónico de procesamiento es para que no se bloque el programa o interfaz de usuario al hacer el «lento» de las cosas. Por lo que su onResponse debe notificar a la persona que llama que el objeto está disponible, y luego mostrarla. Si usted necesita que el usuario espere, y producir un cuadro de diálogo de progreso y luego cerrarlo cuando el resultado está disponible.
  • También comprobar su respuesta. Podría ser null.
InformationsquelleAutor chinabean | 2013-10-16

2 Comentarios

  1. 11

    Para los que vienen a esta pregunta de search & google.

    No hay ninguna razón para esperar por una solicitud asincrónica para finalizar, como es asincrónica, diseño. Si desea sincrónica comportamiento de uso de Volea, usted tiene que utilizar lo que se llama futuros:

    String url = "http://www.google.com/humans.txt";
    
    RequestFuture<String> future = RequestFuture.newFuture();
    StringRequest request = new StringRequest(Request.Method.GET, url, future, future)
    mRequestQueue.add(request);
    
    String result = future.get(); //this line will block

    Tenga en cuenta que usted tiene que ejecutar el bloqueo de código en otro hilo, por lo envuelven en AsyncTask (de lo contrario future.get() bloqueará para siempre).

  2. 0

    Usted puede lograr esto mediante la biblioteca VolleyPlus https://github.com/DWorkS/VolleyPlus

    Tiene algo que se llama VolleyTickle y RequestTickle. Solicitud es el mismo. Es síncrona Petición y sólo una solicitud a tiempo.

    • creo que en VolleyPlus: si la caché de encontrar su toma de caché y responde a la interfaz de usuario principal del hilo. Se me hace que el problema porque no actualización de los datos en el caso de JSON es actualizado. Alguna solución para este problema ??
    • usted puede utilizar el método de setShouldCache en la solicitud. Pasar false para el método y no reconocerá los resultados.

Dejar respuesta

Please enter your comment!
Please enter your name here