Невозможно получить данные из ответа Волли (асинхронный вызов) - PullRequest
0 голосов
/ 15 декабря 2018

Я использую Volley в качестве библиотеки HTTP для управления своим веб-общением, и она прекрасно работает, поскольку каждый респонент, с которым я обычно работаю, это либо JSON, либо String.

Единственная проблема, с которой у меня возникают проблемы, - это конкретный вызов, который отвечает массивом JSON, который анализируется правильно, но я не могу вернуть "проанализированное" значение, так как возврат происходит до вызовазавершено, заканчивая как null.

Вот код:

private ArrayList <User> users;

public ArrayList<User> searchUser(final String usernamestart){

    users= new ArrayList<>();

    StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String serverResponse) {
            parseUsers(serverResponse);
            // see following snippet
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            Toast.makeText(context, "Unable to retrieve data", Toast.LENGTH_LONG).show();
        }
    }) {
        // parameters of POST request
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("session_id", session_id);
            params.put("usernamestart", usernamestart);

            return params;
        }
    };//closes string request

    VolleyQueue.add(request);
    return users;
}    

для анализа ответа и отлично работает, я использую:

private void parseUsers(String jsonResponse){
    try {
        JSONObject jsonObject = new JSONObject(jsonResponse);
        JSONArray array= jsonObject.getJSONArray("users");

        for(int i=0; i < array.length(); i++){
            JSONObject pointedUser= array.getJSONObject(i);
            String username= pointedUser.getString("name");
            String picture= pointedUser.getString("picture");

            users.add(new User(username, picture));
        }
    }catch (JSONException e){
        e.printStackTrace();
    }
}  

Проблема в том, что return users происходит до завершения разговора.Я не могу вернуть ArrayList users внутри onResponse, поскольку это пустой метод ... Я не могу найти никакого решения для этого.

Я пробовал также синхронный вызов, но это не то, чтоЯ хочу.То, что я хотел бы, - метод Volley, который уведомляет меня, когда вызов выполнен, но это еще не то, что реализовано.Надеюсь, что кто-то может помочь мне без необходимости кардинально менять свой актив!

1 Ответ

0 голосов
/ 15 декабря 2018

Это асинхронный вызов, вы не можете вернуть значение, используя выражение return().у вас уже есть метод users в parseUsers, просто используйте его как хотите.

 return users; //delete this line, or the searchUser function will return to the caller before received response.
...