Как правильно написать залп обратного вызова - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь записать залп, получить запрос на получение всех пользователей моего API. Я успешно сделал это, однако, моя функция перестала работать. Если я сейчас запусту свой код и попытаюсь выбрать всех пользователей, он просто вернет пустой массив. Если я попытаюсь получить их еще раз, не останавливая запуск, он вернет мне всех пользователей.

Это моя функция:

public ArrayList<User> getAllUsers(final VolleyCallBack callBack) {
    requestQueue = Volley.newRequestQueue(this);
    JsonArrayRequest arrayRequest = new JsonArrayRequest(
        Request.Method.GET,
        "http://ecoproduce.eu/api/User",
        null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.e("Rest response", response.toString());

                Gson gson = new Gson();
                User user = new User();

                for (int i = 0; i < response.length(); i++) {
                    try {
                        user = gson.fromJson(response.getJSONObject(i).toString(), User.class);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    allUsers.add(user);
                }
                callBack.onSuccess();
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Error response", error.toString());
            }
        }
    );
    requestQueue.add(arrayRequest);
    return allUsers;
}

Это мой интерфейс обратного вызова:

public interface VolleyCallBack {
    ArrayList<User> onSuccess();
}

Вот как я называю функцию:

ArrayList<User> currentUsers;

currentUsers = getAllUsers(new VolleyCallBack() {
        @Override
        public ArrayList<User> onSuccess() {
            Log.e("Bla", "ALL DONE!!!");
            return allUsers;
        }
    });

Я не знаю, в чем проблема, это работало идеально, как час go, но для некоторых причина, это остановилось Это моя первая попытка написания запросов RESTful, и я не могу точно определить ошибку моего кода.

РЕШЕНИЕ:

Проблема решена путем внесения изменений, предложенных Reaz Murshed, и перемещения getAllUsers. вызов тела onCreate, если оно находится внутри функции onClick ().

1 Ответ

1 голос
/ 04 марта 2020

Функция getAllUsers возвращает allUsers сразу после помещения запроса get в фоновый поток. При этом вы получаете список пользователей, когда фоновая нить для вашего API не завершила извлечение вашего списка пользователей, и, следовательно, вы получаете пустой список в первый раз.

Однако во второй раз у вас это происходит, потому что первый запрос API успешно выбрал пользователей и обновил ваш список allUsers. Таким образом, фактически вы не получаете список пользователей из второго запроса API, вы получаете его из запроса, который был сделан ранее.

Чтобы решить эту проблему, не возвращайте allUsers из функции getAllUsers сразу после отправки запроса API. Дождитесь запроса API, чтобы получить данные для вас, и у вас уже есть настройка для успешного обратного вызова, где вы сможете получить желаемые пользовательские данные.

Следовательно, вам необходимо реализовать свой метод onSuccess в своем Activity или Fragment или везде, где вы вызываете метод getAllUsers, и выполнить необходимые действия со списком пользователей при получении успешного перезвонить.

Я бы посоветовал немного изменить функцию обратного вызова, чтобы вы могли фактически передавать информацию, полученную с сервера.

public interface VolleyCallBack {
    void onSuccess(ArrayList<User>);
}

И в функции onResponse обратного вызова Volley передайте список пользователей, который был выбран следующим образом.

callBack.onSuccess(allUsers);

Надеюсь, это поможет!

...