webentwicklung-frage-antwort-db.com.de

Wie kann ich einen Wert von der Funktion onResponse of Volley zurückgeben?

public class getString  {
String tag_string_req = "string_raq";
String url = "http://10.0.2.2/eat/locations/index.json";
String result="";

public String get_String() {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            result=response;
            System.out.println(response);
            ;

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            System.out.println(volleyError.getMessage());
        }
    });
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    return result;
}}

Ich würde ein Objekt von getString erstellen und get_String in anderen Feldern aufrufen. Es scheint jedoch schwierig zu sein, das Ergebnis aus der onResponse herauszuholen. Ich weiß, dass es auf diese Weise nicht funktionieren kann. Kann mir jemand helfen, dieses Problem zu lösen?

45
Wubin Ouyang

Sie möchten Callback-Interfaces wie folgt verwenden:

public void getString(final VolleyCallback callback) {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new     Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            ...  // (optionally) some manipulation of the response 
            callback.onSuccess(response);
        }
    }...
}}

Wobei der Rückruf definiert ist als

public interface VolleyCallback{
    void onSuccess(String result);
}

Beispielcode innerhalb der Aktivität:

public void onResume(){
    super.onResume();

    getString(new VolleyCallback(){
         @Override
         public void onSuccess(String result){
             ... //do stuff here
         }
    });
}

Sie können VolleyCallback auch robuster machen, indem Sie generische Typen verwenden, wenn Sie die Verarbeitung durchführen möchten, oder start(), failed(Exception e), complete() usw Methoden für eine feinkörnigere Statusprüfung.

Denken Sie daran, dass dies ein asynchroner Aufruf ist. Sie müssen also die Ansichten usw. aktualisieren, wenn Sie das Ergebnis zurückerhalten (innerhalb von success()).

123
wblaschko