安卓中检测网络连接的最佳方法

3

我正在开发一个 android 应用程序,想知道检查互联网连接是否存在的最佳方法。我已经尝试使用 connectivity managernetworkinfo 类,但我的应用程序在没有网络的情况下仍然崩溃,或者我可以使用 HttpConnection 方法。有人可以提供他们宝贵的建议吗?


你确定是缺少“net”导致你的应用程序崩溃吗?Raja的代码应该可以工作。 - Austin
是的,我已经在模拟器和手机上都尝试过了。 - Jeris
4个回答

3
    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();
    }

b接收...非常感谢,这段代码完美地运行了。 - Jeris

0

这是一个老问题,但我在这里回答它是为了让其他人也受益。创建一个如下的类:

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
 }

0

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()

我更新了Clairvoyant的方法如下,并使用它,直到我看到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;
}

0
我建议您检查异常以指定发生了什么错误,并根据错误提示用户。
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();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接