Есть ли хороший способ избежать ошибки «хост не разрешен», которая приводит к сбою приложения? Какой-то способ попробовать подключиться к хосту (например, URL-адрес) и посмотреть, действительно ли он действителен?
Ответы:
Используйте URLUtil для проверки URL, как показано ниже.
URLUtil.isValidUrl(url)
Он вернет True, если URL-адрес действителен, и false, если URL-адрес недействителен .
http://
или https://
оно вернется, правда
URLUtil.isValidUrl(url);
Если это не сработает, вы можете использовать:
Patterns.WEB_URL.matcher(url).matches();
Я бы использовал комбинацию методов, упомянутых здесь и в других потоках Stackoverflow:
private boolean isValid(String urlString) {
try {
URL url = new URL(urlString);
return URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
} catch (MalformedURLException e) {
}
return false;
}
Оберните операцию в try / catch. Есть много способов, которыми URL-адрес может быть правильно сформирован, но не извлекаемым. Кроме того, такие тесты, как проверка существования имени хоста, ничего не гарантируют, потому что хост может стать недоступным сразу после проверки. По сути, никакая предварительная проверка не может гарантировать, что извлечение не завершится ошибкой и не вызовет исключения, поэтому лучше спланировать обработку исключений.
Я перепробовал множество методов и обнаружил, что никто не работает нормально с этим URL:
Сейчас использую следующее, и все идет хорошо.
public static boolean checkURL(CharSequence input) {
if (TextUtils.isEmpty(input)) {
return false;
}
Pattern URL_PATTERN = Patterns.WEB_URL;
boolean isURL = URL_PATTERN.matcher(input).matches();
if (!isURL) {
String urlString = input + "";
if (URLUtil.isNetworkUrl(urlString)) {
try {
new URL(urlString);
isURL = true;
} catch (Exception e) {
}
}
}
return isURL;
}
import okhttp3.HttpUrl;
import android.util.Patterns;
import android.webkit.URLUtil;
if (!Patterns.WEB_URL.matcher(url).matches()) {
error.setText(R.string.wrong_server_address);
return;
}
if (HttpUrl.parse(url) == null) {
error.setText(R.string.wrong_server_address);
return;
}
if (!URLUtil.isValidUrl(url)) {
error.setText(R.string.wrong_server_address);
return;
}
if (!url.substring(0,7).contains("http://") & !url.substring(0,8).contains("https://")) {
error.setText(R.string.wrong_server_address);
return;
}
В моем случае Patterns.WEB_URL.matcher(url).matches()
некорректно работает в том случае, когда я String
печатаю аналогично «first.secondword» (мое приложение проверяет ввод пользователя). Этот метод возвращает истину.
URLUtil.isValidUrl(url)
у меня работает правильно. Может быть было бы полезно еще кому-нибудь
Вы можете проверить URL следующим образом:
Patterns.WEB_URL.matcher(potentialUrl).matches()
public static boolean isURL(String text) {
String tempString = text;
if (!text.startsWith("http")) {
tempString = "https://" + tempString;
}
try {
new URL(tempString).toURI();
return Patterns.WEB_URL.matcher(tempString).matches();
} catch (MalformedURLException | URISyntaxException e) {
e.printStackTrace();
return false;
}
}
Это правильное решение, которое я использую. Добавление https://
перед исходным текстом предотвращает рассмотрение текста типа «www.cats.com» как URL
. В случае new URL()
успеха, просто отметьте шаблон, чтобы исключить простые тексты вроде « https: // cats » URL
.