J'ai besoin d'exécuter une demande Volley et d'attendre la réponse pour l'analyser et la renvoyer, mais je ne sais pas comment y parvenir. Quelqu'un peut aider?
Ce que j'ai maintenant est ceci:
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;
}
Une solution de modèle de conception de méthode Factory:
Pour renvoyer ou obtenir une réponse de Volley d'une autre méthode, vous devez écrire une fonctionnalité de rappel, ce qui est simple à l'aide d'interfaces.
Cette solution simple est extraite de mon architecture MVC pour les applications Android développées par moi avec le concept complet facilité d'utilisation et séparation des préoccupations.
Si JSONObject est votre réponse du serveur
Étape 1)
Créez un InterfaceServerCallback
package xx.xx.xx.utils;
import org.json.JSONObject;
public interface ServerCallback{
void onSuccess(JSONObject result);
}
Étape 2) En supposant que votre méthode Demande de serveur Volley soit dans la classe Contrôleur, faites-la dans la vôtre toute Activité
Controller controller = new Controller();
controller.youFunctionForVolleyRequest(email, password, this, loginUrl, new ServerCallback() {
@Override
public void onSuccess(JSONObject response) {
// do stuff here
}
}
);
3) Dans votre classe Controller, appelez ServerCallback function in inResponse () qui exécutera votre code dans Activity uniquement sur la réponse du serveur - mission accomplie!
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);
}
Vous ne devriez probablement pas renvoyer le lien dans votre méthode.
Volley effectue des tâches asynchrones, cela signifie que vous ne pouvez pas savoir quand la réponse vous parviendra de votre service Web. Cela peut prendre 10 secondes ou 10 minutes.
Si vous avez besoin de la chaîne dans votre fonction, vous devriez probablement créer une méthode et l'appeler quand vous aurez le résultat.
Voici un exemple:
Je suppose que c'est ce que tu as
public void getTheLinkAndCallDoSomething(){
String link = getLink();
doSomethingWithTheLink(link);
}
Cela fonctionnerait si getLink()
répondait de manière synchrone. Volley n'est pas dans ce cas.
Et voici ce que vous pouvez faire avec 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);
}
Dans ce cas, vous appelez le service Web pour obtenir votre URL. Et dès que le résultat est connu, vous appelez doSomethingWithTheLink()
Peu importe, si vous voulez vraiment être synchrone, vous pouvez regarder ce post: Attendre le résultat de la demande de Async Volley et le renvoyer
Sachez également que l'attente d'une réponse peut geler l'interface utilisateur de votre application et je suppose que ce n'est pas ce que vous voulez.
J'espère que ça a aidé.
vous ne pouvez renvoyer aucune donnée dans votre méthode getLink()
. Utilisez votre code comme
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);
}
Vous pouvez également voir plus d'informations sur http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-Android-using-volley/