Разница между NetworkInfo.isConnected() и NetworkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED. Что использовать?
Я хочу знать, какой метод будет точным, чтобы проверить состояние сети для успешного подключения.
3 ответа
Так что, если мы посмотрим на исходный код 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
}
Но если вы читаете комментарии для этих подробных состояний, это говорит ниже об этих
Мелкозернистое состояние сетевого подключения. Этот уровень детализации, вероятно, представляет интерес для нескольких приложений. Большинство должно использовать вместо android.net.NetworkInfo.State 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();
этого должно быть достаточно, так как приведенный выше код будет запрашивать активную сеть и определять, имеет ли она подключение к Интернету. Как только вы это знаете, вы можете приступить к доступу к интернет-ресурсу.
Джава:
ConnectivityManager manager =
(ConnectivityManager)getApplication.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info=manager.getActiveNetworkInfo()
if(info!=null && info.isConnected()){
// you are online for sure.
}
Котлин:
val manager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val info = manager.getActiveNetworkInfo()
if (info != null && info.isConnected()) {
// you are online for sure.
}
Я использую вышеуказанный код в своей разработке, чтобы убедиться, что мое устройство подключено к Интернету.
Прочтите эту ветку, чтобы узнать разницу и узнать, как можно изменить состояние
Из исходного кода
public boolean isConnected() {
synchronized (this) {
return mState == State.CONNECTED;
}
}
так это то же самое
Отсюда https://developer.android.com/training/monitoring-device-state/connectivity-monitoring
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" />