我正在尝试从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()的原因是什么?前提是什么?
答案 0 :(得分:1)
您正在使用AsyncHttpClient。你知道吗&#34; 异步 &#34;装置
它缩短了&#34; 异步 &#34;,这意味着&#34;独立于主程序流&#34;发生。在继续之前,您的主程序线程不会等待AsyncHttpClient完成其请求。这就是您的getResponse()
方法立即返回的原因。
您应该将应用设计为以事件驱动的编程原则进行操作;这意味着,在您的情况下,您将生成处理来自onSuccess()
接口方法的响应所需的任何进程或方法。
所以,你可能无法从getResponse()
返回任何内容。你可以void
。您实例化并传递给AsyncHttpResponseHandler()
方法的get()
是一个接口,当某些事件发生时,库将调用该接口,即 GET 请求时成功还是失败。
最后,您必须以某种方式显示您的数据。我假设它在ListView中?如果是这样,您将需要通知ListView其数据已更改(或可能使用新数据重新创建适配器)。见this question。此外,我不确定,但您可能必须使用runOnUIThread()
来更新您的观点,因为这是在另一个线程上运行。