2013-07-04 17 views
7

我試圖使用loopj的async http library發送POST到服務器。下面的代碼是非常標準的,但我無法讓它工作。AsyncHttpRequest POST不觸發回調(android-async-http by loopj)

我已經調試了不少,並已檢查以下內容:

  • 的URL是正確的。
  • 參數是正確的,它們被正確存儲到params變量中。

看來,當HttpResponse response = client.execute(request, context);被稱爲AsyncHttpRequest.makeRequest()請求不包含任何PARAMS:

編輯:看多一點似乎post數據可能被包含在代碼後實體或標題組。

enter image description here

但真正的問題是,我沒有得到任何的回調(參見下面的代碼)。調用client.execute()之後的if語句永遠不會被調用(斷點不會被觸發)。

RequestParams params = new RequestParams(); 
params.put("loginid", "user"); 
params.put("password", "pass"); 
params.put("deviceid", "deviceid"); 

AsyncHttpClient client = new AsyncHttpClient(); 
client.post(MDSettings.BASE_URL + "/user/login", params, new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     Log.d(MDSettings.TAG, "MDConnectionManager - login - response: " + response); 
     singleton.connectionSuccessful(response, returnIndex); 
    } 

    @Override 
    public void onFailure(Throwable error, String content) { 
     Log.d(MDSettings.TAG, "MDConnectionManager - login - content: " + content); 
     singleton.connectionFailed("Login Failed", error.getMessage(), returnIndex); 
    } 
}); 

我使用這個lib,因爲它讓我發送稍後需要的文件到這個項目中。如果有另一個lib執行相同的事情(並且實際上可以工作),那對我來說就沒問題。

我的問題是:爲什麼我沒有得到任何回調,我該如何解決這個問題?告訴我何時不清楚,我會試着更深入地解釋。

+0

是否可以討論一些關於此用戶/登錄文件? –

+0

你想知道什麼?我不認爲你需要看到其他任何東西,因爲我沒有看到'Log.d()'消息,這意味着'onSuccess()'和'onFailure()'回調沒有被調用。 – Manuel

+0

只是因爲一些時間JSON響應沒有生成,因爲無效的參數,所以我問你。只需再次與您的服務代碼槽 –

回答

3

似乎從清單文件已被刪除我android.permission.INTERNET條目。再次添加後,一切都按預期工作。每當有什麼不起作用,我都會檢查我的權限。

+0

謝謝,我剛回到Android一年後忘了這個權限:) –

0

那麼我對這個庫一無所知,但爲什麼不嘗試使用AsyncTasks做類似的東西呢?例如,您可以繼承AsyncTask並提供要加載的URL。另一種方法是對AsyncTask進行子類化併爲其提供一個Callable對象。這種方法將允許您概括此類,使其適合執行不同的長時間任務,而不僅僅是網絡請求。這兩種方法都可以利用一些帶回調的接口(onSuccess,onFailure)。在onPostExecuteMethod中,您可以確定任務執行期間是否出現錯誤,並提供neede回調。

+0

如果我只需要做一個普通的POST,我會完全按照你所說的做,但在項目的後期階段,我還需要發送(相當大的)文件。如果可能的話,我想使用一個庫。 – Manuel

0

在你的代碼中,你直接調用post方法中的responsehanlder。 第一:

client.post(MDSettings.BASE_URL + "/user/login", params, responseHandler); 
下一行

只需添加get方法

client.get(MDSettings.BASE_URL + "/user/login", new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(String response) { 
      System.out.println(response); 
     } 
    }); 

然後U將得到響應從中

+0

我需要從POST獲取響應,而不是從GET(這會給我一個錯誤XML)。 – Manuel

1

試試這個簡單的代碼片段。

這適用於我的設備。

它打印出 「故障」 作爲POST是不允許的(HTTP狀態:405)

AsyncHttpClient client = new AsyncHttpClient(); 
RequestParams params = new RequestParams(); 
params.put("q", "google"); 

client.post("http://google.com", params, new AsyncHttpResponseHandler(){ 
    public void onSuccess(String arg0) { 
     Log.d("TAG", "Success");   
    };          

    public void onFailure(Throwable arg0, String arg1) { 
     Log.d("TAG", "Failure");   
    }; 
}); 
+0

我試過這段代碼,它什麼都沒做(就像我自己的代碼一樣)。它幾乎好像我無法連接到互聯網。 – Manuel

+0

我爲賞金選擇了此答案,因爲它幫助我找到問題(因爲刪除了權限條目而沒有互聯網連接)。 – Manuel