usa gratis descargar desbloqueo codigo app android http post android-volley

android - gratis - Volley-solicitud de http en forma de bloqueo



t mobile device unlock app service (5)

Aquí hay una respuesta más clara que maneja InterruptedException correctamente, así como el tiempo de espera. Tenga en cuenta que la única vez que querría tragar la interrupción y continuar es si tiene la intención específica de utilizar la interrupción para cancelar la respuesta a la solicitud.

RequestFuture<JSONObject> future = RequestFuture.newFuture(); JsonObjectRequest request = new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, future, future); volleyRequestQueue.add(request); try { JSONObject response = null; while (response == null) { try { response = future.get(30, TimeUnit.SECONDS); // Block thread, waiting for response, timeout after 30 seconds } catch (InterruptedException e) { // Received interrupt signal, but still don''t have response // Restore thread''s interrupted status to use higher up on the call stack Thread.currentThread().interrupt(); // Continue waiting for response (unless you specifically intend to use the interrupt to cancel your request) } } // Do something with response, i.e. new SignUpResponseListener().onResponse(response); } catch (ExecutionException e) { // Do something with error, i.e. new MyErrorListener().onErrorResponse(new VolleyError(e)); } catch (TimeoutException e) { // Do something with timeout, i.e. new MyErrorListener().onErrorResponse(new VolleyError(e)); }

Estoy aprendiendo a usar Google Volley en estos días. Es muy conveniente para redes rápidas. Parece que todas las solicitudes se ejecutan en segundo plano en Volley. Por ejemplo:

volleyRequestQueue.add(new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, new SignUpResponseListener(), new MyErrorListener()));

Usando el código anterior, podemos hacer una llamada POST que se ejecuta en segundo plano (forma no bloqueante). Ahora mi pregunta es: ¿Es posible realizar la llamada POST de forma bloqueada? ¿Por qué necesito una forma de bloqueo para hacer una llamada REST? Porque algunas llamadas, como iniciar sesión, deben hacerse antes de hacer otra cosa.

Gracias


No pude hacer funcionar RequestFuture, así que solo utilicé un servicio de escucha de devolución de llamada como sugirió Makibo. No tengo ni idea de por qué fue rechazado, esta es probablemente la mejor solución para el problema común original de las diferentes solicitudes de Volley que todo depende de un inicio de sesión inicial o algo así. En este ejemplo, quiero cargar una foto, pero primero debo verificar si el usuario ha iniciado sesión o no. Si no, tengo que iniciar sesión y luego esperar el éxito antes de cargar la foto. Si ya ha iniciado sesión, vaya directamente a cargar la foto.

Aquí está mi código de muestra:

// interface we''ll use for listener public interface OnLoginListener { public void onLogin(); } public void uploadPhoto(final String username, final String password, final String photo_location) { // first setup callback listener that will be called if/when user is logged in OnLoginListener onLoginListener=new OnLoginListener() { @Override public void onLogin() { uploadPhotoLoggedIn(photo_location); } }; // simplistic already logged in check for this example, just checking if username is null if (loggedInUsername==null) { // if it null, login and pass listener httpLogin(username, password, onLoginListener); } else { // if not null, already logged in so just call listener method onLoginListener.onLogin(); } } public void httpLogin(String username, String password, final OnLoginListener onLoginListener) { StringRequest loginRequest = new StringRequest(Request.Method.POST, "https://www.example.com/login.php", new Response.Listener<String>() { @Override public void onResponse(String txtResponse) { Log.d("",txtResponse); // call method of listener after login is successful. so uploadPhotoLoggedIn will be called now onLoginListener.onLogin(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub Log.d("VOLLEYERROR","error => "+error.toString()); } } ) { }; // Just getting the Volley request queue from my application class (GetApplicatio.java), and adding request GetApplication.getRequestQueue().add(loginRequest); }


Quiero añadir algo a la respuesta de Gabriel. Mientras que RequestFuture bloquea el subproceso desde el que se llama y cumple su función, la solicitud de red en sí no se lleva a cabo en ese subproceso. En su lugar, se lleva a cabo en un hilo de fondo.

Por lo que entiendo después de RequestQueue la biblioteca, las solicitudes en el RequestQueue se envían en su método start() :

public void start() { .... mCacheDispatcher = new CacheDispatcher(...); mCacheDispatcher.start(); .... NetworkDispatcher networkDispatcher = new NetworkDispatcher(...); networkDispatcher.start(); .... }

Ahora, tanto las clases CacheDispatcher como NetworkDispatcher extienden el hilo. Entonces, efectivamente, se genera un nuevo subproceso de trabajo para eliminar la cola de solicitudes y la respuesta se devuelve a los escuchas de errores y éxito implementados internamente por RequestFuture .

Así que no veo ningún punto en hacer un hilo de bloqueo separado para usar RequestFuture . En cambio, como mencionó Makibo en su respuesta, "use un detector de devolución de llamada en Suceso (SignUpResponseListener en ese caso) y coloque el código allí".


Si desea hacer algo exactamente después de la solicitud de Volley, use un detector de devolución de llamada enSuccess (SignUpResponseListener en ese caso) y coloque el código allí. Esta es la mejor práctica.


Volley admite la solicitud de bloqueo a través de RequestFutures. Usted crea una solicitud normal pero establece sus devoluciones de llamada como su solicitud futura, que es solo la extensión de volley de un futuro estándar de Java. La llamada a future.get () se bloqueará.

Se ve algo como esto

RequestFuture<JSONObject> future = RequestFuture.newFuture(); JsonObjectRequest request = new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, future, future) volleyRequestQueue.add(request); try { JSONObject response = future.get(); } catch (InterruptedException e) { } catch (ExecutionException e) { }