【问题标题】:Android : Which is the most effective method to check an active internet connectionAndroid:这是检查活动互联网连接的最有效方法
【发布时间】:2017-01-11 06:24:04
【问题描述】:

我一直在寻找一种快速有效的方法来检查互联网连接,我发现最好 ping google 来查找互联网连接状态。但是我找到了许多 ping google 的方法,我很困惑哪一种在所有这些中使用。以下是我看到的方法。

方法一:

public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

方法二:

public Boolean isOnline() {
    try {
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        return reachable;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

方法三:

public static boolean hasInternetAccess(Context context) {
if (isNetworkAvailable(context)) {
    try {
        HttpURLConnection urlc = (HttpURLConnection) 
            (new URL("http://clients3.google.com/generate_204")
            .openConnection());
        urlc.setRequestProperty("User-Agent", "Android");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500); 
        urlc.connect();
        return (urlc.getResponseCode() == 204 &&
                    urlc.getContentLength() == 0);
    } catch (IOException e) {
        Log.e(TAG, "Error checking internet connection", e);
    }
} else {
    Log.d(TAG, "No network available!");
}
return false;
}

方法四:

public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
    try {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error checking internet connection", e);
    }
} else {
    Log.d(LOG_TAG, "No network available!");
}
return false;
}

我应该选择哪一个?我需要一种更快更有效的方法。

【问题讨论】:

标签: android internet-connection android-internet


【解决方案1】:

您可以尝试使用InetAddress.getByName(host).isReachable(timeOut) 检查主机是否可用。应该和检查连接是否有效一样。

查看文档了解更多信息。InetAddress

【讨论】:

    【解决方案2】:

    我每次都使用广播来检查连接。为连接信息创建一个类。

    import android.content.Context;
    import android.content.ContextWrapper;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    
    
    public class ConnectivityStatus extends ContextWrapper{
    
        public ConnectivityStatus(Context base) {
            super(base);
        }
    
        public static boolean isConnected(Context context){
    
            ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo connection = manager.getActiveNetworkInfo();
            if (connection != null && connection.isConnectedOrConnecting()){
                return true;
            }
            return false;
        }
    }
    

    将代码应用到您的活动中:

     private BroadcastReceiver receiver = new BroadcastReceiver() {
     @Override
     public void onReceive(Context context, Intent intent) {
            if(!ConnectivityStatus.isConnected(getContext())){
                // no connection
            }else {
                // connected
            }
        }
     };
    

    在您的活动的onCreate() 方法中注册广播:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        ..
        ...
        ....
      }
    

    不要忘记在活动周期取消注册/注册:

    @Override
    protected void onResume() {
        super.onResume();
        your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        your_activity_context.unregisterReceiver(receiver);
    
    }
    

    【讨论】:

    • 这仅显示是否启用了 wifi 或移动网络。它不显示互联网连接是否正常。
    • 它工作得很好,可以连续检查连接是否可用。一个检查连接并广播到您的活动以通知连接。此代码在我们的 3 个 Google Play 应用商店中运行良好。
    • @KJEjava48 你试过这个方法吗?
    • 不,正如我所说,你的方法将检查是否有网络。ConnectivityManager 和 NetworkInfo 只检查网络而不是互联网连接。如果我们可以访问网络并不意味着我们可以浏览或使用互联网。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2014-08-28
    • 2014-03-29
    相关资源
    最近更新 更多