0

Я делаю HTTP-запрос. Я хочу проверить, что если я не получу ответ в течение 10 секунд, я бы оставил цикл. Ниже мой код. Что может быть самым простым способом справиться с этим при создании HTTP-запроса. Предложения приветствуются. Если вы можете сообщить мне, где именно я должен включать эти предложения в свой код, это будет очень полезно. БлагодаряОбращение, если ответ задерживается в HTTP-соединении в Android

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

ответ

1

попытка добавить 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); 
      } 
+0

Хорошо, и где я могу уловить его ответ? Я имею в виду, если я хочу поставить тост за тайм-аут? Как мне это сделать ? – user45678

+0

Проверить отредактированный код – Sonali8890

+0

Hi @ Sonali8890 - Посмотреть мой отредактированный вопрос. Я сделал то же самое, что и предложил, и я поставил 20-секундную задержку на моем сервере, после 10 секунд он должен был бросить мне журнал, который я сохранил внутри «ConnectTimeoutException», но ничего не получилось ... Я выполняю правильно? – user45678

0

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

Android - Setting a Timeout for an AsyncTask?

+0

Пожалуйста, не размещайте URL-адрес таким образом, чтобы не было создано никакой ссылки, которую мы можем щелкнуть. Кроме того, get() разрушает функцию asynctask, поэтому я не буду ее комментировать. – greenapps