使用AsyncHttpClient获取包含Github用户列表的JSON响应

时间:2014-11-06 19:34:35

标签: android json github android-async-http asynchttpclient

我正在尝试从github api获得用户json列表的响应。

有人能告诉我代码执行路径未达到覆盖方法 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(...)之后,它会直接跳转到返回内容

有关它的原因的任何想法?我做错了什么?

非常感谢任何建议。


修改 那么正确的方法是在 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()的原因是什么?前提是什么?

1 个答案:

答案 0 :(得分:1)

您正在使用AsyncHttpClient。你知道吗&#34; 异步 &#34;装置

它缩短了&#34; 异步 &#34;,这意味着&#34;独立于主程序流&#34;发生。在继续之前,您的主程序线程不会等待AsyncHttpClient完成其请求。这就是您的getResponse()方法立即返回的原因。

您应该将应用设计为以事件驱动的编程原则进行操作;这意味着,在您的情况下,您将生成处理来自onSuccess()接口方法的响应所需的任何进程或方法。

所以,你可能无法从getResponse()返回任何内容。你可以void。您实例化并传递给AsyncHttpResponseHandler()方法的get()是一个接口,当某些事件发生时,库将调用该接口,即 GET 请求时成功还是失败。

最后,您必须以某种方式显示您的数据。我假设它在ListView中?如果是这样,您将需要通知ListView其数据已更改(或可能使用新数据重新创建适配器)。见this question。此外,我不确定,但您可能必须使用runOnUIThread()来更新您的观点,因为这是在另一个线程上运行。