android json android-asynctask android-volley

Android: ¿Cómo devolver JSONObject asíncrono del método usando Volley?



android-asynctask android-volley (1)

Estoy tratando de recuperar el objeto JSON de la siguiente manera:

JSONObject jsonObject = http.makeRequest("GET", "https://api.twitter.com/1.1/search/tweets.json", null);

El método general para procesar todas las solicitudes HTTP es el siguiente

public void makeRequest(String method, String url, Array params) { // Request a string response from the provided URL. JsonObjectRequest jsonObjReq = new JsonObjectRequest(getRequestMethod(method), url, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { processResponse(Constants.Global.SUCCESS, null, response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { try { mStatusCode = error.networkResponse.statusCode; VolleyLog.d(Constants.Global.ERROR, "Error: " + error.getMessage()); Logger.e(error.getMessage()); } catch (Exception e) { Logger.e(e.getMessage()); mStatusCode = 0; } Logger.e(mStatusCode.toString()); processResponse(Constants.Global.ERROR, mStatusCode, null); } }); // Add tag to request for bulk cancelling //jsonObjReq.setTag() queue.add(jsonObjReq); }

Y el método para procesar el resultado JSON es el siguiente:

private JSONObject processResponse(String resultState, Integer httpStatusCode, JSONObject responseData) { try { // First check that result state is error or the success if (resultState.equals(Constants.Global.SUCCESS)) { Logger.i("Response is success"); Logger.i(responseData.toString()); //TODO: ADD SUCCESS OBJECT CREATION } if (resultState.equals(Constants.Global.ERROR)) { Logger.e("Response is error"); //TODO: ADD ERROR HANDLING AND ERROR OBJECT CREATION } } catch(Exception e) { e.printStackTrace(); Logger.e(e.getMessage()); } return responseData; }

Me gustaría preguntar cómo puedo recuperar JSONObject (primer fragmento de código) de forma asíncrona.

Todas las solicitudes se procesan utilizando la biblioteca Volley.

Muchas gracias por cualquier consejo.


Por su comentario

Creo que Volley proporciona asíncrona automáticamente. Así que necesito saber cómo obtener datos JSON en el primer fragmento

OMI, en lugar de su primer fragmento, puede intentar de la siguiente manera (por supuesto, puede reemplazar la solicitud JSONObject por la solicitud JSONObject ):

VolleyResponseListener listener = new VolleyResponseListener() { @Override public void onError(String message) { // do something... } @Override public void onResponse(Object response) { // do something... } }; makeJsonArrayRequest(context, Request.Method.POST, url, requestBody, listener);

El cuerpo de makeJsonArrayRequest puede ser el siguiente:

public void makeJsonArrayRequest(Context context, int method, String url, String requestBody, final VolleyResponseListener listener) { JSONObject jsonRequest = null; try { ... if (requestBody != null) { jsonRequest = new JSONObject(requestBody); } ... } catch (JSONException e) { e.printStackTrace(); } JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(method, url, jsonRequest, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray jsonArray) { listener.onResponse(jsonArray); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { listener.onError(error.toString()); } }); // Access the RequestQueue through singleton class. MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest); }

Interfaz VolleyResponseListener como la siguiente:

public interface VolleyResponseListener { void onError(String message); void onResponse(Object response); }