web-dev-qa-db-fra.com

Android - Attendez que la réponse de la volée revienne

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;
}
18
JorgeR

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

    }
24
Divyanshu Jimmy

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

12
Quentin Klein

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/

1
Giru Bhai