Android-attendre le retour de la réponse de volley
j'ai besoin d'exécuter une requête Volley et d'attendre la réponse pour l'analyser et la retourner, mais je n'ai aucune idée de la façon d'y arriver. Quelqu'un peut-il 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;
}
3 réponses
Une méthode de Fabrique de modèle de conception de la solution :
pour retourner ou obtenir la réponse de Volley d'une autre méthode, vous devez écrire une fonctionnalité de rappel , qui est tout facile en utilisant des Interfaces
Cette solution simple est tirée de mon architecture MVC pour les applications Android développé par moi avecre utilisabilité et séparation de souci concept.
supposons que JSONObject soit votre réponse du serveur
Étape 1)
Créer un InterfaceServerCallback
package xx.xx.xx.utils;
import org.json.JSONObject;
public interface ServerCallback{
void onSuccess(JSONObject result);
}
Étape 2) supposez que vous demande de serveur Volley méthode Controller classe de le faire dans le vôtre tout 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 de contrôleur , appelez ServerCallback function réponse() qui exécutera votre code en activité seulement sur 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 retourner le lien dans votre méthode.
Volley est en train de faire asynchrone tâches, cela signifie que vous ne pouvez pas savoir quand la réponse arrivera de votre service web, il pourrait être 10sec ou 10min.
Si vous avez besoin de la chaîne dans votre fonction, vous devriez probablement créer une méthode et de l'appeler quand vous avez le résultat.
Voici un exemple:
je suppose que c'est ce que vous avez
public void getTheLinkAndCallDoSomething(){
String link = getLink();
doSomethingWithTheLink(link);
}
Ce serait travail si getLink()
répond de façon synchrone. Le Volley n'est pas dans ce cas.
Et c'est 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 WS pour obtenir votre url. Et dès que le résultat est connu, vous appelez doSomethingWithTheLink()
que ce soit, si vous avez réellement ne voulez être synchrone vous pouvez regarder ce post : Attendre le résultat de Async Volley demande et le retourner
sachez Également que en attente une réponse pourrait geler INTERFACE utilisateur de votre application et je suppose que ce n'est pas ce que vous voulez.
Espérons qu'il a aidé.
vous ne pouvez pas retourner de données dans votre getLink()
méthode.
Utilisez votre code
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);
}
http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/