Gibt es eine gute Möglichkeit, den Fehler "Host ist nicht behoben" zu vermeiden, der eine App zum Absturz bringt? Eine Möglichkeit, eine Verbindung zu einem Host (wie einer URL) herzustellen und festzustellen, ob diese überhaupt gültig ist?
Gibt es eine gute Möglichkeit, den Fehler "Host ist nicht behoben" zu vermeiden, der eine App zum Absturz bringt? Eine Möglichkeit, eine Verbindung zu einem Host (wie einer URL) herzustellen und festzustellen, ob diese überhaupt gültig ist?
Antworten:
Verwenden Sie URLUtil , um die URL wie folgt zu überprüfen .
URLUtil.isValidUrl(url)
Es wird True zurückgegeben, wenn die URL gültig ist, und false, wenn die URL ungültig ist .
http://
oder https://
es wahr zurückkehren wird
URLUtil.isValidUrl(url);
Wenn dies nicht funktioniert, können Sie Folgendes verwenden:
Patterns.WEB_URL.matcher(url).matches();
Ich würde eine Kombination der hier und in anderen Stackoverflow-Threads erwähnten Methoden verwenden:
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;
}
Wickeln Sie den Vorgang in einen Versuch / Fang. Es gibt viele Möglichkeiten, wie eine URL wohlgeformt, aber nicht abrufbar sein kann. Darüber hinaus garantieren Tests wie das Überprüfen, ob der Hostname vorhanden ist, nichts, da der Host unmittelbar nach der Überprüfung möglicherweise nicht mehr erreichbar ist. Grundsätzlich kann keine Vorabprüfung garantieren, dass der Abruf nicht fehlschlägt und eine Ausnahme auslöst. Planen Sie daher besser, die Ausnahmen zu behandeln.
Ich habe viele Methoden ausprobiert. Und finde, dass niemand mit dieser URL gut funktioniert :
Jetzt benutze ich folgendes und alles geht gut.
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;
}
In meinem Fall Patterns.WEB_URL.matcher(url).matches()
funktioniert es nicht richtig, wenn ich String
ähnlich wie "first.secondword" tippe (Meine App überprüft Benutzereingaben). Diese Methode gibt true zurück.
URLUtil.isValidUrl(url)
funktioniert bei mir richtig. Vielleicht wäre es jemand anderem nützlich
Sie können die URL folgendermaßen überprüfen:
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;
}
}
Dies ist die richtige Lösung, die ich verwende. Das Hinzufügen https://
vor dem Originaltext verhindert, dass Text wie "www.cats.com" als betrachtet wird URL
. Wenn dies new URL()
erfolgreich ist, überprüfen Sie das Muster, um einfache Texte wie " https: // Katzen " auszuschließen , die berücksichtigt werden sollen URL
.