0

我正在尝试从 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(...)之后,它会向右跳转以返回 content

关于它的原因有什么想法吗?我究竟做错了什么?

将不胜感激任何建议。


编辑:所以正确的方法是在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()发生?前提是什么?

4

1 回答 1

1

您正在使用 AsyncHttpClient。你知道“异步”是什么意思吗?

它是“异步”的缩写,意思是“独立于主程序流程发生”。您的主程序线程在继续之前不会等待 AsyncHttpClient 完成其请求。这就是您的getResponse()方法立即返回的原因。

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

因此,您可能不会从getResponse(). 你可以做到voidAsyncHttpResponseHandler()您正在实例化并传递给该get()方法的是一个接口,当某些事件发生时库将调用该接口——即,当GET请求成功或失败时。

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

于 2014-11-06T20:19:07.463 回答