Обработать, если ответ задерживается в HTTP-соединении в Android

Я делаю 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;
    }



Ответы (2)


попробуйте добавить HttpConnection Timeout, как показано ниже.

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

ИЗМЕНИТЬ:

Вы можете проверить, произойдет ли тайм-аут внутри блока 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);
            }
person Sonali8890    schedule 07.10.2014
comment
Хорошо, и где я могу поймать его ответ? Я имею в виду, если я хочу поставить тост на тайм-аут, то? Как мне это сделать ? - person user45678; 07.10.2014
comment
Привет @ Sonali8890 - Смотрите мой отредактированный вопрос. Я сделал то же, что вы предложили, и я установил 20-секундную задержку на своем сервере, через 10 секунд он должен был выдать мне журнал, который я сохранил внутри ConnectTimeoutException, но ничего не пришло ... Правильно ли я выполняю? - person user45678; 07.10.2014
comment
Хорошо, я понял. Я также добавил SocketTimeoutException, и он выдал журнал в этом... В любом случае, каким-то образом я мог получить журнал... хе-хе... Огромное спасибо - person user45678; 07.10.2014

Обратитесь к этому сообщению, в нем есть подробности о методе AsyncTask.get(), который можно использовать в этом случае для ожидания определенного периода времени, прежде чем прекратить опрос сервера: -

Android — установка тайм-аута для AsyncTask?

person divyenduz    schedule 07.10.2014
comment
Пожалуйста, не публикуйте URL-адрес таким образом, так как не создается ссылка, по которой мы можем щелкнуть. Кроме того, get() уничтожает функцию асинхронной задачи, поэтому я бы не рекомендовал ее. - person greenapps; 07.10.2014