С помеченным решением я все еще получаю UnknownHostException через 30 с лишним секунд.В этом случае устройство подключено к маршрутизатору Wi-Fi, но нет доступа к Интернету.
Был применен подход к запуску AsyncTask, который просто попытается разрешить имя хоста.Блокирующий вызов каждые 250 мс проверяет, успешно ли он выполнен, и через 4 секунды он отменяет задачу и возвращает ее.
Вот что я сделал для ее решения:
private boolean dnsOkay = false;
private static final int DNS_SLEEP_WAIT = 250;
private synchronized boolean resolveDns(){
RemoteDnsCheck check = new RemoteDnsCheck();
check.execute();
try {
int timeSlept = 0;
while(!dnsOkay && timeSlept<4000){
//Log.d("RemoteDnsCheck", "sleeping");
Thread.sleep(DNS_SLEEP_WAIT);
timeSlept+=DNS_SLEEP_WAIT;
//Log.d("RemoteDnsCheck", "slept");
}
} catch (InterruptedException e) {
}
if(!dnsOkay){
Log.d("resolveDns", "cancelling");
check.cancel(true);
Log.d("resolveDns", "cancelled");
}
return dnsOkay;
}
private class RemoteDnsCheck extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
try {
Log.d("RemoteDnsCheck", "starting");
dnsOkay = false;
InetAddress addr = InetAddress.getByName(baseServiceURL);
if(addr!=null){
Log.d("RemoteDnsCheck", "got addr");
dnsOkay = true;
}
} catch (UnknownHostException e) {
Log.d("RemoteDnsCheck", "UnknownHostException");
}
return null;
}
}
Затемв любое время, когда я хочу сделать веб-вызов, он вызывается в начале функции:
if(!resolveDns()){
return null;
}