2012-09-28 47 views
3

我試圖從android應用程序上傳文件,在服務器上處理它並獲取結果。 服務器端處理大約需要10s,但是在android應用程序中,該過程大約需要15s。我無法解釋其中的差異。使用默認HTTP客戶端(安卓)在Http Post中意外延遲

以下爲代碼在應用程序的相關部分:

HttpParams params = new BasicHttpParams(); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpClient client = new DefaultHttpClient(params); 
HttpPost httpPost = new HttpPost(url); 
httpPost.setHeader("Authorization", getAuthString()); 
httpPost.setEntity(multipart); 
httpPost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); 
HttpResponse response; 
try { 
    Long start = System.currentTimeMillis(); 
    Log.v("Network Call", "Time start: " + start); 
    response = client.execute(httpPost); 
    Long end = System.currentTimeMillis(); 
    Log.v("Network Call", "Time end:" + end); 
    Log.v("Network Call Response Time", "Time:" + (end - start)); 
} 

上述日誌指示總的時間爲約15秒(11-17秒之間隨機變化) 在服務器上,我測量的時間時發佈了HTTP Post請求,並且需要時間讓apache完成請求。這大概是10秒(大致一致)。

不同之處在於服務器php腳本的結束和android客戶端收到數據的時間之間的時差。 (傳輸的數據非常小 - < 5個字符)

這不會發生從客戶端發送到服務器的其他請求(GET請求) - 總時間少於一秒,並且傳輸的數據較大(因此,網絡延遲和帶寬似乎並不成爲問題)

我的問題有以下幾點:

  1. 我是不是正確發佈數據?是否有任何我應該調整的字段讓DefaultHttpClient知道我期待10秒等待?
  2. 有什麼辦法可以追蹤爲什麼這個網絡調用需要花費時間在服務器完成處理請求和客戶端收到請求之間?
+0

您使用的AsyncTask? –

+0

是的,這部分代碼運行裏面和AsyncTask – sajo

+0

我越來越200ms - 300ms延遲.. dint解決了我的問題..希望你會得到答案.. –

回答

1

補充一點:

HttpConnectionParams.setConnectionTimeout(httpParams, 
      TIMEOUT_MILLISEC); 
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC); 
+0

並初始化這個可變參數:final int TIMEOUT_MILLISEC = 20000; –