【问题标题】:Handle if response is delayed in HTTP connection in Android处理Android中HTTP连接中响应延迟的情况
【发布时间】:2014-12-01 15:54:36
【问题描述】:

我正在发出一个 HTTP 请求。我想检查一下,如果我在 10 秒内没有得到响应,我会退出循环。下面是我的代码。在发出 HTTP 请求时处理此问题的最简单方法是什么。欢迎提出建议。如果你能让我知道我应该在我的代码中包含这些建议的确切位置,那将非常有帮助。谢谢

protected String doInBackground(String... params) {
        if (STATUS_STARTED != statusCode) {
            return null;
        }

        final HttpClient client = new DefaultHttpClient();                    


        String email = null;
        String url   = null;

        try {
            email = params[0];
            url   = params[1];

        } catch (ArrayIndexOutOfBoundsException e) {
            Log.e("LOG_TAG", "Invalid parameters are passed to task", e);
            statusCode = STATUS_BADPARAM;
            return null;
        }

        if ( (null == url) || (null == email)) {
            Log.e("LOG_TAG", "One of input params is null: url=" + url + "; email=" + email);
            statusCode = STATUS_BADPARAM;
            return null;
        }

        if(email != null){
            email = email.trim().replaceAll(" ", "");
            //email = email.toLowerCase(); 
            Log.d("EmailLowerCase", "EmailValidator" + email);
        }

        //url += REQUEST_PARAM_START + REQUEST_PARAM_EMAIL + email;
        url += email;

        Log.d("LOG_TAG", "Execute activation request to " + url);

        HttpGet getRequest = null;
        try {
            getRequest = new HttpGet(url);
        } catch (Exception e) {
            Log.e("LOG_TAG", e.getMessage());
        }

        try {
            try {
                int timeoutConnection = 10 * 1000;
                HttpConnectionParams.setConnectionTimeout(client.getParams(), timeoutConnection);
                Log.d("LOG_TAG", "Execute activation request to " + url);
                statusCode = STATUS_IN_PROGRESS;
                HttpResponse response = client.execute(getRequest);
                Log.d("LOG_TAG", "Activation request to " + url
                        + " completed");

                switch (response.getStatusLine().getStatusCode()) {
                case HttpStatus.SC_OK:
                case HttpStatus.SC_MULTI_STATUS:
                case HttpStatus.SC_PARTIAL_CONTENT:
                case HttpStatus.SC_RESET_CONTENT:
                case HttpStatus.SC_CREATED:
                case HttpStatus.SC_ACCEPTED:
                case HttpStatus.SC_NON_AUTHORITATIVE_INFORMATION:
                    statusCode = STATUS_COMPLETED;
                    break;
                case HttpStatus.SC_GATEWAY_TIMEOUT:
                    statusCode = STATUS_GATEWAY_TIMEOUT;
                    return "-1";
                default:
                    Log.e("EmailValidator", "Error "
                            + response.getStatusLine().getStatusCode()
                            + " during activation, url=" + url);
                    statusCode = STATUS_ERROR;
                    break;
                }

                String responseStr = null;
                final HttpEntity entityResponse = response.getEntity();
                if (null != entityResponse) {
                    InputStream inputStream = null;
                    OutputStream outputStream = null;
                    final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
                    try {
                        inputStream = entityResponse.getContent();
                        outputStream = new BufferedOutputStream(dataStream,
                                IO_BUFFER_SIZE);
                        copy(inputStream, outputStream);
                        outputStream.flush();
                        responseStr = dataStream.toString();
                        return responseStr;

                    } finally {
                        if (null != inputStream) {
                            inputStream.close();
                        }
                        if (null != outputStream) {
                            outputStream.close();
                        }
                        if (null != dataStream) {
                            dataStream.close();
                        }
                        entityResponse.consumeContent();
                    }
                }
            } 
            catch (ConnectTimeoutException e) {
                getRequest.abort();
                Log.d("ConnectionTimeOut","Connection timout occured");
            } catch (IOException e) {
                getRequest.abort();
                Log.e("LOG_TAG", "I/O error during activation, url=" + url, e);
            } catch (IllegalStateException e) {
                getRequest.abort();
                Log.e("LOG_TAG", "Incorrect URL: " + url);
            } catch (Exception e) {
                getRequest.abort();
                Log.e("LOG_TAG", "Error during activation, url=" + url, e);
            }
        } catch (Exception e) {
            Log.e("LOG_TAG", "Error during activation, url=" + url, e);
        } catch (Throwable e) {
            Log.e("LOG_TAG", "Error during activation, url=" + url, e);
        }


        Log.e("LOG_TAG", TRANSMITTING_ERROR);
        return null;
    }

【问题讨论】:

    标签: android httpconnection connection-timeout http-response-codes socket-timeout-exception


    【解决方案1】:

    尝试添加 HttpConnection Timeout 如下所示

    int timeoutConnection = 10 * 1000;
    HttpConnectionParams.setConnectionTimeout(client.getParams(),
                    timeoutConnection);
    

    编辑:

    您可以检查 timout 是否会在 catch 块内发生。见下文

     try {
                    Log.d("LOG_TAG", "Execute activation request to " + url);
                    statusCode = STATUS_IN_PROGRESS;
                    HttpResponse response = client.execute(getRequest);
                    Log.d("LOG_TAG", "Activation request to " + url
                            + " completed");
    
                    switch (response.getStatusLine().getStatusCode()) {
                    case HttpStatus.SC_OK:
                    case HttpStatus.SC_MULTI_STATUS:
                    case HttpStatus.SC_PARTIAL_CONTENT:
                    case HttpStatus.SC_RESET_CONTENT:
                    case HttpStatus.SC_CREATED:
                    case HttpStatus.SC_ACCEPTED:
                    case HttpStatus.SC_NON_AUTHORITATIVE_INFORMATION:
                        statusCode = STATUS_COMPLETED;
                        break;
                    case HttpStatus.SC_GATEWAY_TIMEOUT:
                        statusCode = STATUS_GATEWAY_TIMEOUT;
                        return "-1";
                    default:
                        Log.e("EmailValidator", "Error "
                                + response.getStatusLine().getStatusCode()
                                + " during activation, url=" + url);
                        statusCode = STATUS_ERROR;
                        break;
                    }
    
                    String responseStr = null;
                    final HttpEntity entityResponse = response.getEntity();
                    if (null != entityResponse) {
                        InputStream inputStream = null;
                        OutputStream outputStream = null;
                        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
                        try {
                            inputStream = entityResponse.getContent();
                            outputStream = new BufferedOutputStream(dataStream,
                                    IO_BUFFER_SIZE);
                            copy(inputStream, outputStream);
                            outputStream.flush();
                            responseStr = dataStream.toString();
                            return responseStr;
    
                        } finally {
                            if (null != inputStream) {
                                inputStream.close();
                            }
                            if (null != outputStream) {
                                outputStream.close();
                            }
                            if (null != dataStream) {
                                dataStream.close();
                            }
                            entityResponse.consumeContent();
                        }
                    }
                }catch (ConnectTimeoutException e) {
                   Log.i("log","Connection timout occour");
                } catch (IOException e) {
                    getRequest.abort();
                    Log.e("LOG_TAG", "I/O error during activation, url=" + url, e);
                } catch (IllegalStateException e) {
                    getRequest.abort();
                    Log.e("LOG_TAG", "Incorrect URL: " + url);
                } catch (Exception e) {
                    getRequest.abort();
                    Log.e("LOG_TAG", "Error during activation, url=" + url, e);
                }
    

    【讨论】:

    • 好的,我在哪里可以看到它的响应?我的意思是如果我想把吐司放在超时时间呢?我该怎么做?
    • 嗨@Sonali8890 - 请参阅我编辑的问题。我按照你的建议做了同样的事情,我在我的服务器上延迟了 20 秒,10 秒后它应该给我一个日志,我一直保存在“ConnectTimeoutException”中,但什么也没发生……我执行的方式是否正确?跨度>
    • 好的,我知道了。我还添加了 SocketTimeoutException 并且它抛出了日志......无论如何我可以得到一个日志......他他......非常感谢
    【解决方案2】:

    参考这篇文章,它有关于 AsyncTask.get() 方法的详细信息,在这种情况下可以使用它来等待特定的时间,然后再停止轮询服务器:-

    Android - Setting a Timeout for an AsyncTask?

    【讨论】:

    • 请不要以这种方式发布网址,因为不会生成我们可以点击的链接。此外 get() 破坏了 asynctask 函数,所以我不会推荐它。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2015-05-19
    • 1970-01-01
    • 2016-07-09
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多