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;
}
18
demandé sur Mike 2014-05-23 20:14:19

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

    }
23
répondu Divyanshu Jimmy 2018-03-22 09:01:13

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é.

12
répondu Quentin Klein 2017-05-23 12:17:55

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/

1
répondu Giru Bhai 2014-05-23 17:25:49