Czy istnieje dobry sposób na uniknięcie błędu „host nie został rozwiązany”, który powoduje awarię aplikacji? Jakiś sposób, aby spróbować połączyć się z hostem (na przykład adres URL) i sprawdzić, czy jest w ogóle prawidłowy?
Odpowiedzi:
Użyj URLUtil, aby zweryfikować adres URL, jak poniżej.
URLUtil.isValidUrl(url)
Zwróci True, jeśli adres URL jest prawidłowy, lub false, jeśli URL jest nieprawidłowy .
http://
czy https://
wróci prawda
URLUtil.isValidUrl(url);
Jeśli to nie zadziała, możesz użyć:
Patterns.WEB_URL.matcher(url).matches();
Użyłbym kombinacji wymienionych tutaj metod oraz w innych wątkach 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;
}
Zawiń operację w try / catch. Adres URL może być dobrze sformułowany, ale nie można go odzyskać na wiele sposobów. Ponadto testy, takie jak sprawdzenie, czy nazwa hosta istnieje, niczego nie gwarantują, ponieważ host może stać się niedostępny zaraz po sprawdzeniu. Zasadniczo żadna ilość wstępnego sprawdzania nie gwarantuje, że pobieranie nie powiedzie się i nie zgłosi wyjątku, więc lepiej zaplanuj obsługę wyjątków.
Wypróbowałem wiele metod i stwierdziłem, że nikt nie działa dobrze z tym adresem URL:
Teraz używam następujących i wszystko idzie dobrze.
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;
}
W moim przypadku Patterns.WEB_URL.matcher(url).matches()
nie działa poprawnie w przypadku gdy piszę String
podobnie do „first.secondword” (moja aplikacja sprawdza dane wprowadzone przez użytkownika). Ta metoda zwraca wartość true.
URLUtil.isValidUrl(url)
działa poprawnie dla mnie. Może przydałoby się to komuś innemu
Możesz sprawdzić poprawność adresu URL, wykonując następujące czynności:
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;
}
}
To jest właściwe rozwiązanie, którego używam. Dodanie https://
tekstu przed oryginalnym tekstem zapobiega traktowaniu tekstu takiego jak „www.cats.com” jako URL
. Jeśli się new URL()
powiedzie, po prostu sprawdź wzorzec, aby wykluczyć proste teksty, takie jak „ https: // koty ”, które mają być brane pod uwagę URL
.