1

我正在构建一个有助于在 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 秒?)。有没有更快的方法来做到这一点?

4

2 回答 2

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

测试是否连接到互联网:

if (isInternetConnected("http://www.google.com")) {
    showToast("Internet connected");
} else {
    showToast("No connection to the Internet!");
}
于 2013-01-04T00:09:50.580 回答
-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;
    }
}
于 2012-12-28T11:03:55.223 回答