webentwicklung-frage-antwort-db.com.de

Android - Warten Sie, bis die Volleyantwort zurückkehrt

Ich muss eine Volley-Anfrage ausführen und auf die Antwort warten, um sie zu analysieren und zurückzugeben. Ich habe jedoch keine Ahnung, wie das zu erreichen ist. Kann jemand helfen?

Was ich jetzt habe ist folgendes:

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

Eine Lösung für das Factory-Methodendesignmuster:

Um eine Volley-Antwort von einer anderen Methode zurückzugeben oder zu erhalten, müssen Sie eine Callback-Funktion schreiben, die über Schnittstellen einfach zu bedienen ist

Diese einfache Lösung stammt aus meiner MVC-Architektur für Android von mir entwickelte Apps mit vollständigem Wiederverwendbarkeit und Trennung von Bedenken Konzept.

Angenommen, JSONObject ist Ihre Antwort vom Server

Schritt 1)

Erstellen Sie eine Schnittstelle ServerCallback

package xx.xx.xx.utils;

    import org.json.JSONObject;

    public interface ServerCallback{
        void onSuccess(JSONObject result);
    }

Schritt 2) Angenommen, Ihre Volley Server Anfrage Methode ist in Controller Klasse. Tun Sie dies in Ihrer Aktivität

Controller controller = new Controller();
controller.youFunctionForVolleyRequest(email, password, this, loginUrl, new ServerCallback() {
                    @Override
                    public void onSuccess(JSONObject response) {
                       // do stuff here 
                    }
                  }
               );

3) Rufen Sie in Ihrer Controller-Klasse die Funktion ServerCallback in inResponse () auf, die Ihren Code in Activity nur dann ausführt, wenn die Server-Mission erfolgreich war!

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

    }
25
Divyanshu Jimmy

Sie sollten den Link wahrscheinlich nicht in Ihrer Methode zurückgeben.

Volley führt asynchronous - Tasks aus. Dies bedeutet, dass Sie nicht wissen können, wann die Antwort von Ihrem Webservice eingeht. Dies kann 10 Sekunden oder 10 Minuten sein.

Wenn Sie den String in Ihrer Funktion benötigen, sollten Sie wahrscheinlich eine Methode erstellen und diese aufrufen, wenn Sie das Ergebnis haben. 

Hier ist ein Beispiel:

Ich denke, das haben Sie

public void getTheLinkAndCallDoSomething(){
    String link = getLink();
    doSomethingWithTheLink(link);
}

Dies würde funktionieren, wenn getLink() synchron antwortet. Volley ist in diesem Fall nicht.

Und das können Sie mit Volley machen:

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

In diesem Fall rufen Sie das WS an, um Ihre URL zu erhalten. Und sobald das Ergebnis bekannt ist, rufen Sie doSomethingWithTheLink() auf.

Wie auch immer, wenn Sie wirklich synchronous sein wollen, können Sie sich diesen Beitrag ansehen: Warten Sie auf das Ergebnis der Async Volley-Anfrage und geben Sie es zurück .

Beachten Sie auch, dass das Warten auf eine Antwort die Anwendungsbenutzeroberfläche einfrieren könnte. Ich denke, das ist nicht das, was Sie wollen.

Hoffe es hat geholfen.

12
Quentin Klein

sie können keine Daten in Ihrer getLink()-Methode zurückgeben. Verwenden Sie Ihren Code als

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

}

Weitere Informationen finden Sie auch unter http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-Android-using-volley/

1
Giru Bhai

Sie können dies mit dem Zukunftskonzept tun

 RequestFuture<JSONObject> jsonObjectRequestFuture = RequestFuture.newFuture();
    JsonObjectRequest request = new JsonObjectRequest(ServiceUrl.BFF_BASE_URL + path, (JSONObject) postBody, jsonObjectRequestFuture, jsonObjectRequestFuture);
requestQueue.add(request);
JSONObject jsonObject = jsonObjectRequestFuture.get(30, TimeUnit.SECONDS);
0