Разница между NetworkInfo.isConnected () и NetworkInfo.getDetailedState () == NetworkInfo.DetailedState.CONNECTED.Что использовать? - PullRequest
5 голосов
/ 07 марта 2019

Я хочу знать, какой метод будет точным, чтобы проверить состояние сети для успешного подключения.

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Итак, если мы посмотрим на исходный код класса NetworkInfo.java, вы увидите, что подробные состояния сети объявлены как Enum,

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
    }

Но если вы прочитаете комментарии для этих подробных состояний, то об этих * 1007 будет сказано ниже.

Мелкозернистое состояние сетевого подключения. Этот уровень детализации вероятно, представляет интерес для нескольких приложений. Большинство должно использовать android.net.NetworkInfo.State вместо этого.

Метод isConnected() внутри класса NetworkInfo.java проверяет только на State.CONNECTED State,

public boolean isConnected() {
        synchronized (this) {
            return mState == State.CONNECTED;
        }
    }

По существу, если вы используете

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

этого должно быть достаточно, как указано выше, код будет запрашивать активную сеть и определять, имеет ли она подключение к Интернету. Как только вы это узнаете, вы можете перейти к доступу к интернет-ресурсу.

1 голос
/ 07 марта 2019

Java:

 ConnectivityManager manager =
               (ConnectivityManager)getApplication.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo info=manager.getActiveNetworkInfo()

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

Kotlin:

val manager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        val info = manager.getActiveNetworkInfo()

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

Я использую код выше в своей разработке, чтобы быть уверенным, что мое устройствоподключен к интернету.

Прочтите эту тему , чтобы узнать разницу и узнать, как можно изменить состояние

0 голосов
/ 07 марта 2019

из исходного кода

public boolean isConnected() {
    synchronized (this) {
        return mState == State.CONNECTED;
    }
}

, поэтому он такой же

Отсюда https://developer.android.com/training/monitoring-device-state/connectivity-monitoring#java

ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

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

вам нужно будет добавить это в манифест

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...