Android - setSoTimeout не работает
Итак, я запускаю неработающий тайм-аут сокета. Я следил за всеми инструкциями, данными существующими сообщениями, но он все еще не работает (я никогда не получаю исключение тайм-аута сокета). Вот мой код:
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);
}
Ответы
Ответ 1
В то время как у меня были подобные проблемы. Я немного экспериментировал и заметил, что когда я запускал свое приложение в эмуляторе, тайм-ауты не работали, и когда я запускал его на реальном устройстве, он работал. Я тестировал его с помощью DefaultHttpClient
, HttpUrlConnection
и AndroidHttpClient
, все три показали одинаковые результаты; IOexception (UnknownHostException) примерно через 20 секунд в эмуляторе независимо от любого установленного таймаута.
Googling показал, что другие люди также сообщали о проблемах с таймаутом:
Ни один из предлагаемых решений не работал у меня, поэтому я думаю, что единственным надежным решением является управление тайм-аутами самостоятельно.
Ответ 2
В моем примере установлены два тайм-аута. Тайм-аут соединения выдает "java.net.SocketTimeoutException: Socket не подключен" и тайм-аут сокета "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);
Ответ 3
Смотрите: fooobar.com/info/41825/...
Проблема может быть в HTTP-клиенте Apache. См. HTTPCLIENT-1098. Исправлено в 4.1.2.
Исключение тайм-аута пытается отменить DNS-IP для целей ведения журнала. Это занимает дополнительное время, пока исключение не будет действительно запущено.