2017-05-04 39 views
0

我有写功能,检查地址是否可达或不,我的问题是,当响应速度慢或进入超时它冻结用户界面长时间不接收响应或赶上例外。检查网址是否可达Android有超时响应

我的功能是:

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; 
      } 

有一种办法不阻止用户界面?

回答

0

您可以使用插座进行此项:

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. 
+0

你好三江源! 它返回IllegalArgumentException主机错误 – LorenzoBerti

+0

您的网址是“http://stackoverflow.com/”或“http://127.0.0.1/”? –

+0

我试了两个,调试似乎错误是在socket.connect() 现在我有这个:socket.connect(新InetSocketAddress(“192.168.1.20”,80),2000); – LorenzoBerti