Android 检查url是否可通过超时响应访问

Android 检查url是否可通过超时响应访问,android,Android,我有写函数来检查地址是否可到达,我的问题是,当响应缓慢或进入超时时,只要没有收到响应或捕获异常,它就会冻结UI 我的职能是: public static boolean isURLReachable() { ConnectivityManager cm = (ConnectivityManager) App.getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.get

我有写函数来检查地址是否可到达,我的问题是,当响应缓慢或进入超时时,只要没有收到响应或捕获异常,它就会冻结UI

我的职能是:

public static boolean isURLReachable() {
   ConnectivityManager cm = (ConnectivityManager) App.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
   NetworkInfo netInfo = cm.getActiveNetworkInfo();
   if (netInfo != null && netInfo.isConnected()) {
      try {
         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
         StrictMode.setThreadPolicy(policy);
         URL url = new URL(ConfigData.CHECK_IP); 
         HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                        urlc.setConnectTimeout(TIME_OUT_CALL);
                        urlc.setReadTimeout(TIME_OUT_CALL);
                        urlc.connect();
                        if (urlc.getResponseCode() == 200) {        // 200 = "OK" code (http connection is fine).
                            return true;
                        } else {
                            return false;
                        }
                    } catch (MalformedURLException e1) {
                        return  false;
                    }
                    catch (java.net.SocketTimeoutException e) {
                        return false;
                    } catch (IOException e) {
                        return false;
                    }
                }
                return false;
            }

有一种方法可以不阻止用户界面?

您可以使用套接字来实现此目的:

public static boolean isURLReachable() {
    final  URL url  = new URL("your url here");

     final  Socket socket = new Socket();
                            socket.setSoTimeout(200);
                            socket.connect(new   InetSocketAddress(url.getHost(),url.getPort()),200);
                    isConect =socket.isConnected();
                    socket.close();
            return isConect;
}


where 200 is the required timeout.

你好,谢谢!它返回IllegalArgumentException主机错误,我尝试了这两种方法,但调试似乎错误出现在socket.connect()上,现在我有了这个:socket.connect(新的InetSocketAddress(“192.168.1.20”,80),2000);我发现了调试的问题,可能是我在mainThread方法中建立此连接的问题引发了“android.os.NetworkOnMainThreadException”异常。这是一个真正的例外。但并没有解决问题,我发现的唯一方法是在新线程上启动函数