在Android中测试互联网连接

时间:2013-03-17 12:14:23

标签: android network-connection

我已经看到了有关网络连接的所有答案,它们非常好。唯一的问题是下一个用例。

如果手机连接到wifi网络,但路由器丢失了与互联网的连接。所以我考虑将这个添加内容添加到围绕SO给出的代码中:

/** Google public DNS service IP address **/
public static final String GOOGLE = "http://8.8.8.8"; 

public static boolean isConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info == null) {
        return false;
    }
    if (info.isConnected()) {
        try {
            InetAddress addr = InetAddress.getByName(GOOGLE);
            return addr.isReachable(10000);
        } catch (UnknownHostException e) {
            Log.wtf("Utils", e);
        } catch (IOException e) {
            Log.wtf("Utils", e);
        }
        return false;
    } else
        return false;
    }
}

唯一的问题是它在主线程上运行,或更正确地说,它在主线程上运行时崩溃。

如果我将在一个单独的线程中运行它,它将在从服务器获得有效答案之前返回。

有关如何测试互联网连接(与网络连接相关)的任何想法?

1 个答案:

答案 0 :(得分:0)

您必须将逻辑拆分为在检查连接之前和检查连接之后

然后使用 Handler 和后台线程,您可以测试这样的连接:

private static void onConnectivityCheckFinish(boolean result){

}
 public static void isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo info = cm.getActiveNetworkInfo();
        if (info == null) {

            onConnectivityCheckFinish(false);
        }
 if (info.isConnected()) {
        final Handler handler = new Handler(

        );
        new Thread(){
            @Override
            public void run(){
                     try {
                        InetAddress addr = InetAddress.getByName(GOOGLE);
                        final boolean result = addr.isReachable(10000);
                        handler.post(new Runnable(){
                            @Override
                            public void run(){
                                onConnectivityCheckFinish(result);
                            }
                        });
                     } catch (Exception e) {
                        Log.wtf("Utils", e);
                        handler.post(new Runnable(){

                                @Override
                                public void run(){
                                    onConnectivityCheckFinish(false);
                            }

                        });



            }
        }
        }.start();

onConnectivityCheckFinish(false);}
 else {
     onConnectivityCheckFinish(false);
 }
}