如何在Android上设置Http连接超时

如何在Android上设置Http连接超时

问题描述:

我在写一个连接到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) 

试试这个,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

捕捉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