アプリをクラッシュさせる「ホストが解決されていません」というエラーを回避する良い方法はありますか?ホスト(URLなど)に接続して、それが有効かどうかを確認するための何らかの方法はありますか?
回答:
URLUtil を使用して 、以下のようにURLを検証します。
URLUtil.isValidUrl(url)
これは、返されたURLが有効である場合はTrueとURLが無効の場合はfalse。
http://
か、https://
それが真に戻る限り、それはそうです
URLUtil.isValidUrl(url);
これが機能しない場合は、次を使用できます。
Patterns.WEB_URL.matcher(url).matches();
操作をtry / catchでラップします。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;
}
次の方法で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
ます。