Подтвердить что ты не робот

Как я могу вернуть значение из функции 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;
}}

Я хотел бы построить объект getString и вызвать get_String в других полях. Но, похоже, трудно получить результат из onResponse. Я знаю, что он не может работать таким образом. Может ли кто-нибудь помочь мне решить эту проблему?

4b9b3361

Ответ 1

Вы хотите использовать интерфейсы обратного вызова, например:

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

Если обратный вызов определяется как

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

Пример кода внутри действия:

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

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

Вы также можете сделать VolleyCallback более надежным, используя общие типы, если хотите выполнить обработку, или добавив методы start(), failed(Exception e), complete() и т.д., чтобы выполнить немного более мелкозернистую проверку состояния.

Имейте в виду, что это асинхронный вызов, поэтому вам придется обновлять представления и т.д., когда вы возвращаете результат (внутри success()).

Ответ 2

Этот ответ также помог мне. Спасибо за вклад