java android wait android-volley

java - Android-Espera la respuesta de volea para volver



wait android-volley (3)

Probablemente no deberías devolver el enlace en tu método.

Volley está realizando tareas asíncronas , lo que significa que no puede saber cuándo llegará la respuesta de su servicio web, podría ser de 10 segundos o 10 minutos.

Si necesita la cadena en su función, probablemente debería crear un método y llamarlo cuando tenga el resultado.

Aquí hay un ejemplo:

Supongo que esto es lo que tienes

public void getTheLinkAndCallDoSomething(){ String link = getLink(); doSomethingWithTheLink(link); }

Esto funcionaría si getLink() responde de manera sincrónica. Volley no está en este caso.

Y esto es lo que puedes hacer con Volley:

public void getTheLinkAndCallDoSomething(){ JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { shortenURL = response.getString("url"); doSomethingWithTheLink(shortenURL); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); queue.add(jsObjRequest); }

En este caso, llame al WS para obtener su url. Y tan pronto como se conoce el resultado, llamas doSomethingWithTheLink()

Lo que sea, si realmente desea ser sincrónico , puede consultar esta publicación: Espere el resultado de la solicitud de Async Volley y devuélvala.

Además, tenga en cuenta que esperar una respuesta podría congelar la interfaz de usuario de su aplicación y supongo que no es lo que desea.

Espero que haya ayudado.

Necesito ejecutar una solicitud de Volley y esperar la respuesta para analizarla y devolverla, pero no tengo idea de cómo lograrlo. ¿Alguien puede ayudar?

Lo que tengo ahora es esto:

public String getLink() { JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { shortenURL = response.getString("url"); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); queue.add(jsObjRequest); return shortenURL; }


no puede devolver ningún dato en su método getLink() . Usa tu código como

String shortenURL = ""; // activity global variable public void getLink() { JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { shortenURL = response.getString("url"); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); queue.add(jsObjRequest); }

También puede ver más información en http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/


Una solución de patrón de diseño de método de fábrica:

Para devolver u obtener la respuesta de Volley de otro método, debe escribir una funcionalidad de devolución de llamada, que es muy fácil de usar interfaces.

Esta solución simple se toma de mi arquitectura MVC para aplicaciones de Android desarrolladas por mí con un concepto completo de facilidad de uso y separación de preocupaciones .

Suponiendo que JSONObject es su respuesta del servidor

Paso 1)

Crear una interfaz ServerCallback

package xx.xx.xx.utils; import org.json.JSONObject; public interface ServerCallback{ void onSuccess(JSONObject result); }

Paso 2) Suponiendo que el método de solicitud del servidor Volley esté en la clase Controlador , haga esto en la suya en cualquier Actividad

Controller controller = new Controller(); controller.youFunctionForVolleyRequest(email, password, this, loginUrl, new ServerCallback() { @Override public void onSuccess(JSONObject response) { // do stuff here } } );

3) En su clase de Controlador, llame a la función ServerCallback en inResponse () que ejecutará su código en la Actividad solo en respuesta de la misión del servidor realizada!

public void youFunctionForVolleyRequest(final String email , final String password ,final Context context , final String URL, final ServerCallback callback) { HashMap<String, String> params = new HashMap<String, String>(); params.put("email", email); params.put("password", password); Log.e("sending json",params.toString()); JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, URL, new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { callback.onSuccess(response); // call call back function here } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //VolleyLog.d("Volley error json object ", "Error: " + error.getMessage()); } }){ @Override public String getBodyContentType() { return "application/json"; } }; // Adding request to request queue AppController.getInstance().addToRequestQueue(jsonObjReq); }