Android究竟是如何判断是不是在线的?

Posted

技术标签:

【中文标题】Android究竟是如何判断是不是在线的?【英文标题】:How exactly does Android determine whether it's online?Android究竟是如何判断是否在线的? 【发布时间】:2012-11-04 05:38:39 【问题描述】:

android究竟是如何判断以下状态的区别的?

    网络接口处于活动状态(例如 Wifi 或 3G),但无法访问互联网。

    网络接口处于活动状态,需要要求用户在网页上登录网络。

    网络接口处于活动状态并能够访问互联网。

它是否可能向固定 URL(可能在 google.com 上?)发送一个简单的 HTTP 请求并检查返回的文档是否符合预期?如果有,我们是否知道使用的 URL?

【问题讨论】:

【参考方案1】:

更新:更新了代码以避免NetworkOnMainThreadException

我目前正在使用以下方法来判断设备是否可以上网:

public class NetworkConnectivityHelper 
    public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback)

        new Thread(new Runnable() 
            @Override
            public void run() 
                boolean isDeviceConnectedToInternet = false;
                NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

                if(activeNetworkInfo != null && activeNetworkInfo.isConnected())
                    try 
                        InetAddress.getByName("google.com").isReachable(2);
                        isDeviceConnectedToInternet = true;
                     catch (UnknownHostException e)
                        isDeviceConnectedToInternet = false;
                     catch (IOException e)
                        isDeviceConnectedToInternet = false;
                    
                

                final boolean result = isDeviceConnectedToInternet;
                activity.runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                        callback.done(result);
                    
                );

            
        ).start();

    


    public static abstract class ResultCallback
        public abstract void done(boolean connected);
    

通过以下方式调用:

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    ....
    //Populate
    NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper();
    networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() 
        @Override
        public void done(boolean connected) 
            if (connected) 
                //Yey, the device is connected. 
                //Now, do some work
            else
                //The device is disconnected
            
        
    );
    ....


希望这会有所帮助!

【讨论】:

这将在更高版本的 android 上强制关闭,以便在主线程上使用网络连接。此外,在我测试的需要登录的 wifi 网络上,此测试在不应该连接时仍返回为已连接。【参考方案2】:

是的,您也可以发送 ping :)

您应该在小型网络实用程序类中使用的订单操作是: - 检查接口是否在线 - 检查它是否能够打开到 Google.com 的套接字或 ping google.com

【讨论】:

【参考方案3】:

试试这个:

public static boolean isNetworkAvailable(Context context)

    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();

    return (info != null);

【讨论】:

以上是关于Android究竟是如何判断是不是在线的?的主要内容,如果未能解决你的问题,请参考以下文章

究竟什么是产品经理

如何判断文件共享服务器是不是在线? [复制]

Android的@hide注解究竟是做啥的?

bufferedReader() 在 Kotlin 中究竟是如何工作的?

那些好用的 VS Code 插件,究竟是如何提高编码效率的?

在线预约小程序搭建教程4-首页的制作