【问题标题】:How to check for internet connectivity before making a request如何在发出请求之前检查互联网连接
【发布时间】:2015-01-10 20:21:36
【问题描述】:

我有这个常用的代码来向服务器发出 HTTP 请求。

      HttpClient httpclient = new DefaultHttpClient();
      ...
        HttpGet httpGet = new HttpGet(finalUri.toURI());
        httpGet.addHeader("Accept", "text/xml");

        response = httpclient.execute(httpGet);

当有互联网连接时,这可以正常工作。但是当没有互联网连接时,代码只需在httpclient.execute(httpGet); 等待很长时间,直到超时并引发异常并导致应用程序崩溃。

01-10 15:17:48.612  20692-20806/com.somepackage.somepackage  E/EXCEPTION﹕ Unable to resolve host "myapi.myhost.com": No address associated with hostname

对于异常我可以捕获UnknownHostException e 并处理它。但是有没有办法预先知道缺少互联网连接?

【问题讨论】:

标签: java android


【解决方案1】:

您可以使用 NetworkInfo 来达到目的。

private boolean checkNetworkConnection() {
    NetworkInfo networkInfo = ((ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
    if (networkInfo == null || !networkInfo.isConnected()) {
        return false;
    } else {
        return true;
    }
}

【讨论】:

    【解决方案2】:

    这对我有用。

    public boolean IsInternetAvailable(Context context)
    {
    
        ConnectivityManager connectivityManager 
                = (ConnectivityManager) (context.getSystemService(Context.CONNECTIVITY_SERVICE));
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
    

    【讨论】:

      【解决方案3】:

      通过连接类型检查互联网连接状态的另一种方法:

      public boolean getConnectionStatus(Context context) {
      int conn = NetworkUtil.getConnectivityStatus(context);
      if (conn == NetworkUtil.TYPE_WIFI||conn == NetworkUtil.TYPE_MOBILE) {
        return true;
      } 
      else{
         return false
      }
      
      }
      

      【讨论】:

        【解决方案4】:

        我建议像下面这样检查。您可以通过标准java.net.URLConnection 类简单地检查。

         try{
             URLConnection urlConnection = finalUri.openConnection();
             urlConnection.connect();
         }
         catch(Exception ex){
            //No connection to finalUri
            // return your error code for no connection
         }
        

        【讨论】:

          【解决方案5】:

          在您当前的ActivityFragment 中添加一个新方法:

          private boolean isNetworkAvailable(){
                  boolean available = false;
                  /** Getting the system's connectivity service */
                  ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
          
                  /** Getting active network interface  to get the network's status */
                  NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
          
                  if(networkInfo !=null && networkInfo.isAvailable())
                      available = true;
          
                  /** Returning the status of the network */
                  return available;
              }
          

          这里是如何使用它。您可以在onCreate() 方法中使用它:

          if (isNetworkAvailable() == true){ // if network is available
             // do your thing here
             ...
          }else{ // "else" means that the network is not available
             // do your thing here
             ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-02
            • 1970-01-01
            • 2019-05-26
            相关资源
            最近更新 更多