Получите ответ JSON, содержащий список пользователей Github, используя AsyncHttpClient

Я пытаюсь получить ответ со списком пользователей json из github api.

Может ли кто-нибудь сказать мне причину, по которой путь выполнения кода не достигает переопределенных методов onFailure() и onSuccess?

public String getResponse()
{
    AsyncHttpClient client=new AsyncHttpClient();
    RequestParams params=new RequestParams();
    params.put("since","0");
    client.get("https://api.github.com/users", params, new AsyncHttpResponseHandler() {

                @Override
                public void onFailure(int arg0, Header[] arg1, byte[] arg2,
                                      Throwable arg3) {
                    userList.clear();
                    userList.addFirst("Items didn't load properly");

                }

                @Override
                public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {

                    try {
                        content = new String(arg2, "UTF-8");
                        //content is json response that can be parsed.
                    } catch (UnsupportedEncodingException e1) {
                        userList.clear();
                        userList.add("Some encoding problems occured");
                        e1.printStackTrace();
                    }
                }
            });
    return content;
}

Эти методы просто игнорируются по какой-то причине. После client.get(...) выполняется переход вправо к return content.

Есть идеи о причине этого? Что я делаю не так?

Был бы признателен за любой совет.


EDIT: ТАК правильный способ сделать это — работать с ответом в методе onSuccess(...)?

                    @Override
                public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {

                    try {
                        content = new String(arg2, "UTF-8");
                        //content is json response that can be parsed.

                        parseResponseAmount(content, 10); //operate with response 
                    } catch (UnsupportedEncodingException e1) {
                        userList.clear();
                        userList.add("Some encoding problems occured");
                        e1.printStackTrace();
                    }
                }

И я пытаюсь разобрать информацию из ответа, например:

private  void parseResponseAmount (String response, int amount)
{
    try {
        JSONArray readerArray = new JSONArray(response);
        for (int i = 0; i < amount; i++)
        {
            JSONObject userObject = (JSONObject) readerArray.get(i);
            String login = userObject.getString("login");
            getUserList().add(login);
        }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        getUserList().clear();
        getUserList().add("Failed to parse response");
        e.printStackTrace();
    }
}

но этот код все еще не работает. В управляемой событиями разработке это вызвано движением мыши, нажатием клавиш и т. д. Что вызывает эти onSuccess() и onFailure()? Что является предварительным условием?


person AnZyuZya    schedule 06.11.2014    source источник


Ответы (1)


Вы используете AsyncHttpClient. Вы знаете, что означает "Асинхронный"?

Это сокращение от «Асинхронный», что означает «происходит независимо от основного потока программы». Ваш основной программный поток не будет ждать, пока AsyncHttpClient выполнит свой запрос, прежде чем продолжить. Вот почему ваш метод getResponse() немедленно возвращается.

Вы должны проектировать свое приложение так, чтобы оно работало на принципах программирования, управляемого событиями; в вашем случае это означает, что вы создадите любой процесс или метод, который вам нужен для обработки ответа от метода интерфейса onSuccess().

Таким образом, вы, вероятно, ничего не вернете из getResponse(). Вы можете сделать это void. AsyncHttpResponseHandler(), который вы создаете и передаете методу get(), представляет собой интерфейс, который библиотека будет вызывать при возникновении определенных событий, то есть при успешном или неудачном выполнении запроса GET.

Наконец, вам нужно будет как-то показать свои данные. Я предполагаю, что это в ListView? Если это так, вам нужно будет уведомить ListView об изменении его данных (или, возможно, воссоздать адаптер с новыми данными). См. этот вопрос. Кроме того, я не уверен, но вам, возможно, придется использовать runOnUIThread() для обновления ваших представлений, так как это выполняется в другом потоке.

person JstnPwll    schedule 06.11.2014
comment
Спасибо за ответ! Вот что происходит, когда вы работаете с новыми библиотеками, не читая их документацию. Насколько я вас понял, правильный способ работы с ней - это обрабатывать ответ в методе onSuccess(). Не могли бы вы проверить отредактированный пост? - person AnZyuZya; 07.11.2014
comment
да, getResponse() теперь не возвращает значение. Да, для отображения данных я использую адаптер и mAdapter.notifyDataSetChanged(). Содержимое ListView обновляется по запросу (список обновления по запросу). Но забавно то, что при первом извлечении ничего не происходит, поэтому onFailure() или onSuccess не вызываются. Но при каждом следующем извлечении я получаю сообщение об ошибке из метода onFailure() - person AnZyuZya; 07.11.2014