【问题标题】:how to set Http connection timeout on Android如何在 Android 上设置 Http 连接超时
【发布时间】:2013-03-26 06:31:27
【问题描述】:

我正在编写一个连接到网络服务的应用程序,如果它无法获得连接,我不希望它等待太久。因此,我设置了 httpparams 的 connectionTimeout。但它似乎没有任何效果。

这是我的代码

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();
        }

    }

现在我添加异常

但我的日志类别会在 5 秒内显示任何错误。它会给我 2 3 mint 的错误。

这里有错误

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)

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个,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();
            }
    

    【讨论】:

      【解决方案2】:

      捕捉 SocketTimeoutException 和 ConnectTimeoutException 。

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

      【讨论】:

      • @vivektiwari 当网络服务执行时间过长时会发生连接超时异常,因此这两个异常可以帮助您捕获异常发生错误。如果您想测试此呼叫,您可以通过应用程序进行服务,然后立即终止您的互联网连接。
      • 好的。目前我的服务器不在线。所以对于这种情况,我该如何管理持续时间。目前我的装载机在 2 -3 mint 附近可见。如果我的服务器处于离线状态,我希望它只显示 3 或 5 秒。
      • @vivektiwari 您在添加上述例外后检查过吗?因为您将其设置为 3 - 5 秒。
      • 请将一些值记录到异常中。我想看看调用了哪个异常。
      • 我刚刚发布了我的日志。但它永远不会在 2 3 mint 之前给出任何错误或发布任何值。
      猜你喜欢
      • 2017-04-17
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多