有没有好的方法可以避免因主机无法解析而导致应用程序崩溃的错误?是否有一种方法可以尝试连接到主机(如URL),并查看它是否有效?
有没有好的方法可以避免因主机无法解析而导致应用程序崩溃的错误?是否有一种方法可以尝试连接到主机(如URL),并查看它是否有效?
使用 URLUtil 来验证以下URL。
URLUtil.isValidUrl(url)
如果URL有效,它将返回True,如果URL无效,它将返回false。
http://
或 https://
,它就会返回 true。 - heheURLUtil.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;
}
如果您使用的是 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
}
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;
}
只需添加这一行代码:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
我试过很多方法,但是发现没有一个完全适用于这个链接。
现在我使用以下方法一切都很顺利。
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;
}
将操作包装在try/catch中。有许多方式可以使URL格式正确但无法检索。此外,像查看主机名是否存在这样的测试并不能保证任何事情,因为主机在检查后可能变得不可达。基本上,没有任何预先检查可以保证检索不会失败并抛出异常,因此最好计划处理异常。
Patterns.WEB_URL.matcher(url).matches()
在我输入类似于“first.secondword”的String
时无法正确工作(我的应用检查用户输入)。这个方法返回true。URLUtil.isValidUrl(url)
正确地工作。也许对其他人有用。Patterns.WEB_URL.matcher(url).matches()
在我的端上也失败了,我认为这是因为链接中没有 www
,只有 https
。 - undefinedpublic 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
。