Есть ли хороший способ избежать ошибки "host is not resolved", которая приводит к сбою приложения? Какой-то способ попробовать подключиться к хосту (например, URL-адрес) и посмотреть, действительно ли он действителен?
Как проверить правильность URL-адреса в Android
Ответ 1
Используйте URLUtil, чтобы проверить URL-адрес, как показано ниже.
URLUtil.isValidUrl(url)
Он вернет True, если URL-адрес действителен и false, если URL-адрес недействителен.
Ответ 2
URLUtil.isValidUrl(url);
Если это не работает, вы можете использовать:
Patterns.WEB_URL.matcher(url).matches();
Ответ 3
простой способ
Использовать шаблон WEB_URL в классе шаблонов
Patterns.WEB_URL.matcher(potentialUrl).matches()
Он вернет True, если URL-адрес действителен и false, если URL-адрес недействителен.
Длинный ответ
Начиная с уровня API Android 8, существует WEB_URL. Цитируя исходный код, он "соответствует большинству RFC 3987". Если вы нацелились на более низкий уровень API, вы можете просто скопировать шаблон из источника и включить его в свое приложение. Я предполагаю, что вы знаете, как использовать шаблоны и шаблоны, поэтому я не буду вдаваться в подробности здесь.
Также класс URLUtil содержит некоторые полезные методы, например:
Описание методов не очень сложное, поэтому вы, вероятно, лучше всего смотрите на источник и выясняете, какой из них лучше подходит для вашей цели.
Что касается того, когда запускать проверку проверки, существует несколько возможностей: вы можете использовать функции обратного вызова EditText
или используйте TextWatcher, который, я думаю, будет лучше.
НЕ ИСПОЛЬЗУЙТЕ URLUtil, чтобы проверить URL-адрес, как показано ниже.
URLUtil.isValidUrl(url)
потому что он дает строки типа "http://" как действительный URL, который не является истинным
Ответ 4
Оберните операцию в try/catch. Существует много способов, которыми URL-адрес может быть хорошо сформирован, но не доступен. Кроме того, тесты, такие как просмотр, если имя хоста существует, не гарантируют ничего, потому что хост может стать недоступным сразу после проверки. В принципе, никакая предварительная проверка не может гарантировать, что извлечение не завершится ошибкой и вызовет исключение, поэтому лучше планировать обработку исключений.
Ответ 5
Я бы использовал комбинацию методов, упомянутых здесь и в других потоках Stackoverflow:
private boolean isValid(String urlString) {
try {
URL url = new URL(urlString);
return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
} catch (MalformedURLException e) {
}
return false;
}
Ответ 6
Я пробовал много методов. И обнаружил, что никто не работает отлично с этот 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;
}
Ответ 7
Вы можете проверить URL следующим образом:
Patterns.WEB_URL.matcher(potentialUrl).matches()
Ответ 8
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;
}
Ответ 9
В моем случае Patterns.WEB_URL.matcher(url).matches()
работает некорректно в случае, когда я набираю String
, похожее на "first.secondword" (Мое приложение проверяет ввод пользователя). Этот метод возвращает true.
URLUtil.isValidUrl(url)
работает правильно для меня. Возможно, это было бы полезно для кого-то другого.
Ответ 10
Если вы используете из kotlin
вы можете создать String.kt
и написать код ниже:
fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
Затем:
String url = "www.yourUrl.com"
if (!url.isValidUrl()) {
//some code
}else{
//some code
}
Ответ 11
new java.net.URL(String) throws MalformedURLException
Ответ 12
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
.