在android中检查互联网访问的最快方法

时间:2012-12-28 10:59:45

标签: android wifi httpurlconnection

我正在构建一个有助于在Android上配置WIFI设置的应用,我需要以最快的方式来检查有效的互联网连接。 工作连接 - 不仅连接了WIFI!

我正在使用此代码

URL url = new URL("http://www.google.com");
                                final HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                                urlc.setRequestProperty("User-Agent", "Android Application");
                                urlc.setRequestProperty("Connection", "close");
                                        urlc.setConnectTimeout(3 * 1000);
                                        urlc.connect();

                                        if (urlc.getResponseCode() == 200) { // Good response



                                        } else { 
                                        //bad   

                                        }
                                    } catch (IOException e) {
                                         //bad
                                    }

但是获得响应需要很长时间,大约20秒(即使超时为3秒?)。 有更快的方法吗?

2 个答案:

答案 0 :(得分:0)

您的代码看起来很好,如果您还添加了urlc.setReadTimeout(TIME_OUT);

,也许效果会更好

下面是我使用的代码,到目前为止它已经捕获了WiFi /移动连接的各种场景,但没有互联网等等。

public boolean isNetworksAvailable() {
    ConnectivityManager mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (mConnMgr != null)  {
        NetworkInfo[] mNetInfo = mConnMgr.getAllNetworkInfo();
        if (mNetInfo != null) {
            for (int i = 0; i < mNetInfo.length; i++) {
                if (mNetInfo[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;
}

此代码执行的操作是循环通过所有网络状态以确保它找到CONNECTED状态,然后才isNetworksAvailable()

isInternetConnected中,我们会检查是否可以建立一个简单的HTTP URL连接。

public boolean isInternetConnected(String mUrl) {
    final int CONNECTION_TIMEOUT = 2000;
    if (isNetworksAvailable()) {
        try {
            HttpURLConnection mURLConnection = (HttpURLConnection) (new URL(mUrl).openConnection());
            mURLConnection.setRequestProperty("User-Agent", "ConnectionTest");
            mURLConnection.setRequestProperty("Connection", "close");
            mURLConnection.setConnectTimeout(CONNECTION_TIMEOUT);
            mURLConnection.setReadTimeout(CONNECTION_TIMEOUT);
            mURLConnection.connect();
            return (mURLConnection.getResponseCode() == 200);
        } catch (IOException ioe) {
            Log.e("isInternetConnected", "Exception occured while checking for Internet connection: ", ioe);
        }
    } else {
        Log.e("isInternetConnected", "Not connected to WiFi/Mobile and no Internet available.");
    }
    return false;
}

此代码应在AsyncTask中使用,否则您需要将其与以下代码一起使用,例如在onCreate()中(但强烈建议使用AsyncTask而不是在网络上进行UI线程)

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

测试是否连接到Internet:

if (isInternetConnected("http://www.google.com")) {
    showToast("Internet connected");
} else {
    showToast("No connection to the Internet!");
}

答案 1 :(得分:-1)

在拨打服务器电话之前,请使用以下方法:

public static boolean isOnline() {

    try {
        ConnectivityManager cm = (ConnectivityManager) Const.CONTEXT
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm != null) {
            return cm.getActiveNetworkInfo().isConnectedOrConnecting();
        } else {
            return false;
        }
    } catch (Exception e) {
        return false;
    }
}