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);
}