Несколько случайных NetworkCallbacks (onAvailable) с одинаковым идентификатором сети из ConnectivityManager - PullRequest
1 голос
/ 08 января 2020

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

Проблема возникает на моем устройстве LG Lollipop

Android Документация: (https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback)

onAvailable Добавлено на уровне API 21 Вызывается, когда инфраструктура подключается и объявляет новую сеть, готовую к использованию. Этот обратный вызов может вызываться более одного раза, если сеть, удовлетворяющая запросу, изменяется

РЕДАКТИРОВАТЬ: я реализовал другие методы из обратного вызова, чтобы проверить, запущены ли какие-либо другие методы (onLosing, onUnavailable, onCapabilitiesChanged , onLinkPropertiesChanged), но ни один из них не называется

У меня есть собственный NetworkManager с этим кодом:

public void initialize(Context context) {
    connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    setState();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        final NetworkRequest networkRequest = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();

        connectivityManager.registerNetworkCallback(networkRequest, new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(final Network network) {
                super.onAvailable(network);
                NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
                Log.d(TAG,"Network is Available. Network Info: " + networkInfo);
                notifyObservers();
            }

            @Override
            public void onLost(final Network network) {
                super.onLost(network);
                notifyObservers();
            }
        });
    } else {
        context.registerReceiver(new NetworkChangeReceiver(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }
}

Журналы:

Network is Available. Network Info: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "company_guest", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
Network is Available. Network Info: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "company_guest", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
Network is Available. Network Info: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "company_guest", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
Network is Available. Network Info: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "company_guest", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...