0

我正在发出 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;
    }
4

2 回答 2

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);
            }
于 2014-10-07T09:07:06.840 回答
0

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

Android - 为 AsyncTask 设置超时?

于 2014-10-07T09:04:26.187 回答