2014-11-06 36 views
0

我试图从github api获取用户json列表的响应。使用AsyncHttpClient获取包含Github用户列表的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

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

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

您应该设计您的应用程序以运行事件驱动编程原则;这意味着,在你的情况下,你会产生任何你需要处理来自onSuccess()接口方法的响应的过程或方法。

所以,你可能不会从getResponse()返回任何东西。您可以制作void。您正在实例化并传递给get()方法的AsyncHttpResponseHandler()是库发生特定事件时将调用的接口 - 即请求成功或失败时的接口。

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

+0

感谢您的回答!当你在不阅读文档的情况下使用新库时会发生什么......据我所知,正确的方法是在** onSuccess()方法中处理响应。你能检查编辑过的文章吗? – AnZyuZya 2014-11-07 12:36:56

+1

更新了我的答案。 – 2014-11-07 14:20:08

+0

是的,'getResponse()'现在不返回值。是的,要显示数据我使用适配器和'mAdapter.notifyDataSetChanged()'。 ListView的内容在pull(拉到刷新列表)上更新。但有趣的是,第一次拉什么都没有发生,因此'onFailure()'或'onSuccess'没有被调用。但是,接下来的每一次我都会从'onFailure()'方法中得到一个错误 – AnZyuZya 2014-11-07 14:31:03