Как вытащить строку из onResponse?

266
17 августа 2017, 20:57

Как сделать так, чтобы serverAnswer передавался вне onResponse?

А то получается так, что в onResponse в serverAnswer кладутся данные, но вне onResponse переменная serverAnswer пустая.

Допустим, если выводить Toast с serverAnswer в onResponse, то выведется нужный текст, а если, допустим, выводить Toast вне onResponse, то выведется пустота.

И addUser передает пустую строку.

public String addUser(final String username, final String email, final String password, final Context context) {
    StringRequest request = new StringRequest(Request.Method.POST,
            REGISTER_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(final String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        final JSONObject status = jsonObject.getJSONObject("Result");
                        serverAnswer = status.getString("Server answer");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    serverAnswer = error.getMessage();
                }
            }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put(KEY_USERNAME, username);
            params.put(KEY_EMAIL, email);
            params.put(KEY_PASSWORD, password);
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(request);
    return serverAnswer;
}
Answer 1

У Вас асинхронный запрос, поэтому везде по коду, до момента выполнения запроса, serverAnswer будет пустой. Метод addUser(...) возвращает значение до того, как с сервера пришел ответ.

Предложу пару вариантов:

  1. В метод addUser(...) можете передавать коллбэк:

    public interface OnRequestFinishedListener {
        void onResponse(String serverAnswer);
    }
    

     

    public void addUser(..., OnRequestFinishedListener onRequestFinishedListener) {
        ...
    }
    

    и после ответа сервера вызывать соответствующий метод:

    onRequestFinishedListener.onResponse(serverAnswer);
    
  2. Можно выполнить запрос синхронно, но тогда придется самому возиться с созданием фонового потока, в котором будет выполняться метод.

READ ALSO
Веб-приложение, архитектура, логика, Java, Servlet, EL, JSP, HTML, SQL, JDBC и Геркулесовая каша в голове. У всех так было поначалу?

Веб-приложение, архитектура, логика, Java, Servlet, EL, JSP, HTML, SQL, JDBC и Геркулесовая каша в голове. У всех так было поначалу?

Прошу сообщество помочь мне в собрании пазла из всех этих технологий, понятий, разработок пестрящих в сети и уложить в моей голове понимание...

218
Сериализация наследуемого класса

Сериализация наследуемого класса

Есть иерархия классов указанная ниже, для сериализации хватит ли имплиментировать Serializable только классу A, для сериализации классов типа...

306
Как сделать жадную выборку в Spring data?

Как сделать жадную выборку в Spring data?

Есть 2 сущьности User и RoleМне нужно сделать выборку User что бы Role которая у User на полях тоже инициализировалась

408