Чи є хороший спосіб уникнути помилки "хост не вирішено", яка викликає збій програми? Якийсь спосіб спробувати підключитися до хоста (наприклад, URL-адреса) і перевірити, чи він взагалі дійсний?
Відповіді:
Використовуйте URLUtil для перевірки URL-адреси, як показано нижче.
URLUtil.isValidUrl(url)
Він поверне значення True, якщо URL-адреса є дійсним, і false, якщо URL-адреса недійсна .
http://
або https://
воно справдиться
URLUtil.isValidUrl(url);
Якщо це не працює, ви можете використовувати:
Patterns.WEB_URL.matcher(url).matches();
Я б використав комбінацію методів, згаданих тут та в інших потоках Stackoverflow:
public static boolean IsValidUrl(String urlString) {
try {
URL url = new URL(urlString);
return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
} catch (MalformedURLException ignored) {
}
return false;
}
Оберніть операцію у спробі / лові. Є багато способів, як 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" (мій додаток перевіряє введення користувачем). Цей метод повертає true.
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
.