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