如何设置Android的HTTP连接超时 [英] how to set Http connection timeout on Android

查看:109
本文介绍了如何设置Android的HTTP连接超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写一个连接到Web服务的应用程序,我不希望它等待太久,如果它不能得到一个连接。因此,我设置的HttpParams的为ConnectionTimeout。但它似乎没有任何有任何效果。

下面是我的code

 公共无效的doPost(ArrayList中<的NameValuePair>列表){

        HttpPost后=新HttpPost(URL);
        的HttpParams httpParameters =新BasicHttpParams();
        //毫秒设置超时,直到建立了连接。
        //默认值是零,这意味着在超时不被使用。
        INT timeoutConnection = 3000;
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        //设置默认套接字超时(SO_TIMEOUT)
        //毫秒这是超时等待数据。
        INT timeoutSocket = 5000;
        HttpConnectionParams.setSoTimeout(httpParameters,timeoutSocket);

        DefaultHttpClient的HttpClient =新DefaultHttpClient(httpParameters);

        httpClient.setParams(httpParameters);
        尝试 {
            post.setEntity(新UrlEn codedFormEntity(名单));
            HTT presponse响应= httpClient.execute(后);

            Log.i(回应,response.toString());

            Log.i(响应code,
                    + response.getStatusLine()的getStatus code())。

            如果(响应!= NULL){

                HttpEntity实体= response.getEntity();

                如果(实体!= NULL){
                    InputStream的河道= entity.getContent();
                    结果= convertStreamToString(河道);
                    Log.i(结果,结果);
                    //关闭输入流会触发连接释放
                    instream.close();
                }
            } 其他 {
                Log.i(服务器错误,服务器没有响应);
            }
        }赶上(UnsupportedEncodingException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }赶上(ClientProtocolException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }赶上(IOException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }

    }
 

现在我加入异常

但我的日志美食dosent在5第二场的任何错误。它会给我的错误在2 3薄荷。

下面是错误

  12月三号至26号:36:59.165:W / System.err的(491):产生java.net.SocketException:操作超时
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(本机方法)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
十二月3号至26号:36:59.165:W / System.err的(491):在java.net.Socket.connect(Socket.java:1055)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
十二月3号至26号:36:59.165:W / System.err的(491):在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
十二月3号至26号:36:59.165:W / System.err的(491):在com.raa.json.JsonParser1.getJSONFromUrl(JsonParser1.java:39)
十二月3号至26号:36:59.165:W / System.err的(491):在com.raa.activity.ProductListActivity $ MyTask.doInBackground(ProductListActivity.java:168)
十二月3号至26号:36:59.165:W / System.err的(491):在com.raa.activity.ProductListActivity $ MyTask.doInBackground(ProductListActivity.java:1)
十二月3号至26号:36:59.165:W / System.err的(491):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
十二月3号至26号:36:59.165:W / System.err的(491):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
十二月3号至26号:36:59.165:W / System.err的(491):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
十二月3号至26号:36:59.165:W / System.err的(491):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
十二月3号至26号:36:59.165:W / System.err的(491):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:561)
十二月3号至26号:36:59.165:W / System.err的(491):在java.lang.Thread.run(Thread.java:1096)
 

解决方案

试试这个,私有静态长TIME_OUT_IN_SECONDS = 120;

 的System.out.println(posthhhhhhhhhhhhhhhhhhh);

        DefaultHttpClient的HttpClient =新DefaultHttpClient();
        HttpPost httpPost =新HttpPost(URL);
        httpPost.setEntity(新UrlEn codedFormEntity(PARAMS));

        HTT presponse HTT presponse = NULL;
        长requestStratTime =新的日期()的getTime()。

        HTT presponse = httpClient.execute(httpPost);
        长requestEndTime =新的日期()的getTime()。
        Log.d(requestStratTime,requestStratTime+ requestStratTime);
        Log.d(requestEndTime,requestEndTime+ requestEndTime);
        长timeOfRequest =(requestEndTime  -  requestStratTime)/ 1000;
        Log.d(timeOfRequest,timeOfRequest+ timeOfRequest);
        如果(HTT presponse == NULL和放大器;&安培; timeOfRequest> TIME_OUT_IN_SECONDS){

            抛出新TimeoutException异常();
        }

        。INT响应code = HTT presponse.getStatusLine()的getStatus code();
        的System.out.println(响应code+响应code);
        字符串SS = HTT presponse.getStatusLine()的toString()。
        的System.out.println(ssssssssssssssssssssssss+ SS);
        如果(响应code == 200){

            HttpEntity httpEntity = HTT presponse.getEntity();
            是= httpEntity.getContent();

        } 其他 {
            抛出新ParsingException();
        }
 

I'm writing an application that connects to a webservice and I don't want it to wait too long if it can't get a connection. I therefore set the connectionTimeout of the httpparams. But it doesn't seem to have any effect whatsoever.

Here is my code

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

    }

now i add exception

but my log cate dosent show any error within 5 second. it will give me error on 2 3 mint.

here is error

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)

解决方案

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

这篇关于如何设置Android的HTTP连接超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆