2013-03-26 34 views
2

我在寫一個連接到web服務的應用程序,如果它無法獲得連接,我不希望它等待太久。因此,我設置了httpparams的connectionTimeout。但它似乎沒有任何影響。如何在Android上設置Http連接超時

這裏是我的代碼

public void doPost(ArrayList<NameValuePair> list) { 

     HttpPost post = new HttpPost(URL); 
     HttpParams httpParameters = new BasicHttpParams(); 
     // Set the timeout in milliseconds until a connection is established. 
     // The default value is zero, that means the timeout is not used. 
     int timeoutConnection = 3000; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 
       timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 5000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

     DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 

     httpClient.setParams(httpParameters); 
     try { 
      post.setEntity(new UrlEncodedFormEntity(list)); 
      HttpResponse response = httpClient.execute(post); 

      Log.i("response ", response.toString()); 

      Log.i("response code", "" 
        + response.getStatusLine().getStatusCode()); 

      if (response != null) { 

       HttpEntity entity = response.getEntity(); 

       if (entity != null) { 
        InputStream instream = entity.getContent(); 
        result = convertStreamToString(instream); 
        Log.i("Result ", result); 
        // Closing the input stream will trigger connection release 
        instream.close(); 
       } 
      } else { 
       Log.i("SERVER ERROR ", "Server Not responding"); 
      } 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

我現在加入異常

但我的日誌美食dosent5秒內顯示任何錯誤。它會給我2 3薄荷錯誤。

這裏是錯誤

03-26 12:36:59.165: W/System.err(491): java.net.SocketException: The operation timed out 
03-26 12:36:59.165: W/System.err(491): at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method) 
03-26 12:36:59.165: W/System.err(491): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115) 
03-26 12:36:59.165: W/System.err(491): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244) 
03-26 12:36:59.165: W/System.err(491): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533) 
03-26 12:36:59.165: W/System.err(491): at java.net.Socket.connect(Socket.java:1055) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
03-26 12:36:59.165: W/System.err(491): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
03-26 12:36:59.165: W/System.err(491): at com.raa.json.JsonParser1.getJSONFromUrl(JsonParser1.java:39) 
03-26 12:36:59.165: W/System.err(491): at com.raa.activity.ProductListActivity$MyTask.doInBackground(ProductListActivity.java:168) 
03-26 12:36:59.165: W/System.err(491): at com.raa.activity.ProductListActivity$MyTask.doInBackground(ProductListActivity.java:1) 
03-26 12:36:59.165: W/System.err(491): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-26 12:36:59.165: W/System.err(491): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
03-26 12:36:59.165: W/System.err(491): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
03-26 12:36:59.165: W/System.err(491): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
03-26 12:36:59.165: W/System.err(491): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
03-26 12:36:59.165: W/System.err(491): at java.lang.Thread.run(Thread.java:1096) 

回答

4

試試這個,private static long TIME_OUT_IN_SECONDS = 120;

  System.out.println("posthhhhhhhhhhhhhhhhhhh"); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 
     httpPost.setEntity(new UrlEncodedFormEntity(params)); 

     HttpResponse httpResponse = null; 
     long requestStratTime = new Date().getTime(); 

     httpResponse = httpClient.execute(httpPost); 
     long requestEndTime = new Date().getTime(); 
     Log.d("requestStratTime", "requestStratTime" + requestStratTime); 
     Log.d("requestEndTime", "requestEndTime" + requestEndTime); 
     long timeOfRequest = (requestEndTime - requestStratTime)/1000; 
     Log.d("timeOfRequest", "timeOfRequest" + timeOfRequest); 
     if (httpResponse == null && timeOfRequest > TIME_OUT_IN_SECONDS) { 

      throw new TimeOutException(); 
     } 

     int responseCode = httpResponse.getStatusLine().getStatusCode(); 
     System.out.println("responseCode" + responseCode); 
     String ss = httpResponse.getStatusLine().toString(); 
     System.out.println("ssssssssssssssssssssssss" + ss); 
     if (responseCode == 200) { 

      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     } else { 
      throw new ParsingException(); 
     } 
+0

幹得好Rishi .................. – 2015-09-05 06:10:19

+0

謝謝先生......... @NareshSharma – 2015-09-07 04:26:15

2

捕捉SocketTimeoutException和ConnectTimeoutException。

catch (SocketTimeoutException e) 
{ 
    e.printStackTrace(); 
} 
catch (ConnectTimeoutException e) 
{ 
    e.printStackTrace(); 
} 
+0

謝謝。但沒有任何事情發生 – 2013-03-26 06:42:04

+0

它將如何提供幫助? – 2013-03-26 06:42:10

+0

@vivektiwari當Web服務需要太多時間執行時,會發生連接超時異常,因此這兩個異常可幫助您捕獲發生異常的錯誤。如果你想測試這個電話,你可以通過應用程序,然後立即終止你的互聯網連接。 – 2013-03-26 06:45:30