web-dev-qa-db-fra.com

Comment puis-je retourner la valeur de function onResponse of Volley?

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

Je voudrais construire un objet de getString et appeler get_String dans d'autres champs. Mais il semble qu'il soit difficile d'obtenir le résultat de onResponse. Je sais que cela ne peut pas fonctionner de la manière actuelle. Quelqu'un pourrait-il m'aider à régler ce problème?

45
Wubin Ouyang

Vous voulez utiliser des interfaces de rappel comme ceci:

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

Où le rappel est défini comme

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

Exemple de code dans l'activité:

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

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

Vous pouvez également rendre VolleyCallback plus robuste, en utilisant des types génériques si vous souhaitez effectuer un traitement, ou en ajoutant start(), failed(Exception e), complete(), etc. méthodes pour faire un peu plus fine vérification d'état.

N'oubliez pas qu'il s'agit d'un appel asynchrone. Vous devrez donc mettre à jour les vues, etc. lorsque vous récupérerez le résultat (dans success()).

123
wblaschko