首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkInfo.isConnected()和NetworkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED之间的区别。使用什么?

NetworkInfo.isConnected()和NetworkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED之间的区别。使用什么?
EN

Stack Overflow用户
提问于 2019-03-07 07:12:38
回答 3查看 700关注 0票数 5

我想知道哪种方法将精确地检查网络状态以成功连接。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-07 08:02:11

因此,如果我们查看源代码 of NetworkInfo.java类,您将看到网络详细状态声明为Enum,

代码语言:javascript
复制
public enum DetailedState {
        /** Ready to start data connection setup. */
        IDLE,
        /** Searching for an available access point. */
        SCANNING,
        /** Currently setting up data connection. */
        CONNECTING,
        /** Network link established, performing authentication. */
        AUTHENTICATING,
        /** Awaiting response from DHCP server in order to assign IP address information. */
        OBTAINING_IPADDR,
        /** IP traffic should be available. */
        CONNECTED,
        /** IP traffic is suspended */
        SUSPENDED,
        /** Currently tearing down data connection. */
        DISCONNECTING,
        /** IP traffic not available. */
        DISCONNECTED,
        /** Attempt to connect failed. */
        FAILED,
        /** Access to this network is blocked. */
        BLOCKED,
        /** Link has poor connectivity. */
        VERIFYING_POOR_LINK,
        /** Checking if network is a captive portal */
        CAPTIVE_PORTAL_CHECK
    }

但是如果你读到这些DetailedState的评论,它会在下面提到

网络连接的细粒度状态。这种详细程度可能是少数应用程序感兴趣的。大多数人应该使用android.net.NetworkInfo.State状态。

isConnected()类中的NetworkInfo.java方法仅针对State.CONNECTED State进行检查,

代码语言:javascript
复制
public boolean isConnected() {
        synchronized (this) {
            return mState == State.CONNECTED;
        }
    }

本质上如果你用

代码语言:javascript
复制
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();

这应该足够了,因为上面的代码将查询活动网络并确定它是否具有Internet连接性。一旦你知道了,你就可以继续访问互联网资源了。

票数 3
EN

Stack Overflow用户

发布于 2019-03-07 07:24:30

Java:

代码语言:javascript
复制
 ConnectivityManager manager =
               (ConnectivityManager)getApplication.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo info=manager.getActiveNetworkInfo()

if(info!=null && info.isConnected()){
// you are online for sure.
}

Kotlin:

代码语言:javascript
复制
val manager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        val info = manager.getActiveNetworkInfo()

        if (info != null && info.isConnected()) {
            // you are online for sure.
        }

我在我的开发中使用上面的代码来确保我的设备连接到互联网上。

阅读此线程以了解差异以及如何更改状态

票数 1
EN

Stack Overflow用户

发布于 2019-03-07 07:26:05

从源代码

代码语言:javascript
复制
public boolean isConnected() {
    synchronized (this) {
        return mState == State.CONNECTED;
    }
}

所以这是一样的

从这里开始https://developer.android.com/training/monitoring-device-state/connectivity-monitoring#java

代码语言:javascript
复制
ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnected();

您需要将此添加到您的清单中。

代码语言:javascript
复制
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55037991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档