2014-11-06 50 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