最好的方法来检查Android中的互联网连接

最好的方法来检查Android中的互联网连接

问题描述:

我正在开发android应用程序,我想知道检查互联网连接是否存在的最佳方法。我曾尝试使用connectivity managernetworkinfo类,但无济于事,因为我的应用程序一直在没有网络的情况下崩溃,否则我会去HttpConnection方法。有人可以提出宝贵的建议。最好的方法来检查Android中的互联网连接

+0

你确定这是缺乏导致你的应用程序崩溃的“网络”吗? Raja的代码应该可以工作。 – Austin

+0

是的,我已经尝试过它在模拟器和手机上 –

URL myurl = new URL(url); 
    URLConnection connection = myurl.openConnection(); 
    connection.setConnectTimeout(20 * 1000); 
    HttpURLConnection httpConnection = (HttpURLConnection) connection; 
    int responseCode = -1; 
    try { 
     responseCode = httpConnection.getResponseCode(); 
    } catch (Exception e1) {      
      throw e1;     
    } 
    if (responseCode == HttpURLConnection.HTTP_OK) { 
      //connection is OK and do what you want 
      //... 
    } 
    else 
    { 
      //connection is not OK 
      httpConnection.disconnect(); 
    } 
+0

breceive ...非常感谢这个代码很好的工作。 –

+0

你的欢迎:) – breceivemail

它的一个老问题,但我正在做的是在这里回答,使其对其他人也有用。使一个类象下面这样:

public class ConnectionDetector { 

    private Context context; 

    public ConnectionDetector(Context context) { 
     this.context = context; 
    } 

    public boolean isConnectedToInternet() { 

     ConnectivityManager connectivity = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 

     } 
     return false; 
    } 
} 

然后从activity调用类method像这样来检查连接:

if(new ConnectionDetector(context).isConnectedToInternet()){ 
    //Connected 
    //do what you want to do here 
} else{ 
    // Not connected 
    // show appropriate message 
} 

Udacity的优秀高级Android应用程序开发过程中使用getActiveNetworkInfo()

https://www.udacity.com/course/advanced-android-app-development--ud855

/** 
* @param context Context used to get the ConnectivityManager 
* @return true if network has connectivity (i.e. is reachable), else return false 
*/ 
static public boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return ((activeNetworkInfo != null) 
      && activeNetworkInfo.isConnectedOrConnecting()); 
} 

顺便说一句:Clairvoyant使用getAllNetworkInfo的好答案,现在在API级别23中已弃用。

Android文档说使用getAllNetworks()和getNetworkInfo(android.net.Network)来代替。

http://developer.android.com/reference/android/net/ConnectivityManager.html#getAllNetworkInfo()

我如下更新火眼金睛的方法,并用它,直到我看到上面Udacity的简单方法isNetworkAvailable。

/** 
* @return true if network has connectivity (i.e. is reachable), else return false 
*/ 
boolean hasConnectivity(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    if (connectivityManager != null) { 
     Network[] networks = connectivityManager.getAllNetworks(); 
     if ((networks != null) 
       && (networks.length > 0)) { 
      for (Network network : networks) { 
       NetworkInfo info = connectivityManager.getNetworkInfo(network); 
       if (info.getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 

我建议您检查异常以指定发生了什么错误,并且您可以根据错误提示用户。

try { 
    URL url = new URL("https://google.com"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setConnectTimeout(10000); 
    connection.connect(); 
    success = connection.getResponseCode() == 200; 
} catch (IOException e) { 
    //use the function here 
    onError(this,e); 
} 

public void onError(Activity activity,Throwable e){ 
     try { 
      e.printStackTrace(); 
      FirebaseCrash.report(e); 

      if (e instanceof HttpException) { 
       Response body = ((HttpException) e).response(); 
       if (body.code() == 401) { 
        Toast.makeText(activity, "Not Authorized Access", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 404) { 
        Toast.makeText(activity, "Request not found", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 400) { 
        Toast.makeText(activity, "Bad Request", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 500) { 
        Toast.makeText(activity, "Internal Server Error", Toast.LENGTH_SHORT).show(); 
       } else { 
        Log.e(Constants.TAG, "Error : Code HTTP = " + body.code()); 
       } 
      }else if(e instanceof ConnectException || e instanceof SocketException){ 
       Toast.makeText(activity, "No Internet Connection", Toast.LENGTH_SHORT).show(); 
      } else if (e instanceof UnknownHostException) { 
       Toast.makeText(activity, "Make Sure Your Internet Connection is Properly Connected", Toast.LENGTH_SHORT).show(); 
      } else if (e instanceof SSLHandshakeException || e instanceof SSLPeerUnverifiedException) { 
       Toast.makeText(activity, "Server Connection Problem..Please Try Again", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(activity, "Data Load Error", Toast.LENGTH_SHORT).show(); 
      } 
     } 
     catch (Exception ex){ 
      FirebaseCrash.report(e); 
      e.printStackTrace(); 
     } 
    }