Вопрос по android, android-asynctask – Android - setSoTimeout не работает

1

Так что у меня не работает тайм-аут сокета. Я следовал всем инструкциям, данным существующими сообщениями, но он все еще не работает (я никогда не получаю исключение тайм-аута сокета). Вот мой код:

AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String>() {
   @Override
   protected String doInBackground(String... params) {
      String location = params[0];

      try {
         HttpGet httpGet = new HttpGet(location);
         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 = 0;
         HttpConnectionParams.setConnectionTimeout(httpParameters,
               timeoutConnection);

         // Set the default socket timeout (SO_TIMEOUT)
         // in milliseconds which is the timeout for waiting for data.
         int timeoutSocket = 2000;
         HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

         DefaultHttpClient client = new DefaultHttpClient(httpParameters);
         Log.d(this.getClass().getSimpleName(), "STARTING CLIENT!!! ");
         HttpResponse response = client.execute(httpGet);
         Log.d(this.getClass().getSimpleName(), "CLIENT CANCELLED!!! ");

         if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            return new Scanner(out.toString()).useDelimiter("\\A").next();
         } else {
            return "";
         }
      } catch (IOException e) {
         e.printStackTrace();
         return null;
      } catch (URISyntaxException e) {
         e.printStackTrace();
         return null;
      }
   }

   @Override
   protected void onPostExecute(String result) {
      try {
         // doStuff
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
};
task.execute(location);

Так что я должен получить исключение тайм-аута сокета через две секунды, но клиент просто игнорирует это. Любая помощь

Заранее спасиб

Так вот весь код:

public void fetch(String location) {    
    AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String>() {
        @Override
        protected String doInBackground(String... params) {
            String location = params[0];

            try {
                HttpGet httpGet = new HttpGet(location);
                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 = 0;
                HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
                // Set the default socket timeout (SO_TIMEOUT) 
                // in milliseconds which is the timeout for waiting for data.
                int timeoutSocket = 2000;
                HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

                DefaultHttpClient client = new DefaultHttpClient(httpParameters);
                Log.d(this.getClass().getSimpleName(), "STARTING CLIENT!!! ");
                HttpResponse response = client.execute(httpGet);
                Log.d(this.getClass().getSimpleName(), "CLIENT CANCELLED!!! ");

                if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    return new Scanner(out.toString()).useDelimiter("\\A").next();
                } else {
                    return "";
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            } catch (URISyntaxException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                //doStuff
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    task.execute(location);
}

Ваш Ответ

3   ответа
2

аметил, что когда я запускал свое приложение в эмуляторе, таймауты не работали, а когда я запускал его на реальном устройстве, он работал. Я проверил это сDefaultHttpClient, HttpUrlConnection а такжеAndroidHttpClient, все три показали одинаковые результаты; IOexception (UnknownHostException) примерно через 20 секунд в эмуляторе независимо от установленного времени ожидания.

Google показал, что другие люди также сообщали о проблемах с таймаутом:

http: //code.google.com/p/android/issues/detail ID = 2409 Тайм-аут соединения на Android не работает Проблемы с тайм-аутом соединения Тайм-аут сокета при выполнении запросов HTTPGet с использованием DefaultHTTPClient

Ни одно из предложенных решений не сработало для меня, поэтому я думаю, что единственное надежное решение - это самостоятельно управлять таймаутами.

0

ыдает «java.net.SocketTimeoutException: сокет не подключен», а время ожидания сокета «java.net.SocketTimeoutException: истекло время ожидания операции».

HttpGet httpGet = new HttpGet(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);
HttpResponse response = httpClient.execute(httpGet);

Если вы хотите установить параметры любого существующего HTTPClient (например, DefaultHttpClient или AndroidHttpClient), вы можете использовать функцию setParams ().

HttpClient.setParams (httpParameters);

ничего не изменилось ... я уже пробовал это user1416721
hi @ user1416721 Я добавил новый код. это работает для меня. Я использовал два дня назад. работал нормально. используйте это и дайте мне знать. itsrajesh4uguys
нет, все еще не работает. клиент начинает выполняться и никогда не завершается менее чем за 5 секунд, и не генерируется исключение SocketTimeoutException ... Может быть, ему нужно что-то сделать, я использую его в doInBackground в качестве AsyncTask? user1416721
так, когда я отключаю интернет-соединение, "клиент отменен" никогда не достигается. Примерно через 5-10 секунд я получаю исключение. но сначала я хочу получить sockettimeoutexception ... Log.d (this.getClass (). getSimpleName (), "НАЧАЛО КЛИЕНТА !!!"); HttpResponse response = client.execute (httpGet); Log.d (this.getClass (). GetSimpleName (), "КЛИЕНТ ОТМЕНЕН !!!"); user1416721
если вам нужен больше кода или информации, дайте мне знать. Я борюсь с этой проблемой уже 6 часо user1416721
0

https: //stackoverflow.com/a/20031077/260923

Возможно, проблема в HTTP-клиенте Apache. Смотри HTTPCLIENT-1098. Исправлено в 4.1.2.

Исключение тайм-аута пытается изменить DNS IP для целей регистрации. Это займет дополнительное время, пока исключение не будет запущено.

Похожие вопросы