Réagir à l'état du réseau sur Android avec Kotlin

Dans le métro, dans la forêt, à la montagne.. une application n'a pas toujours accès à internet, dans cet article, nous allons voir comment prévenir un utilisateur en cas de perte de connexion sur une application Android

Réagir à l'état du réseau sur Android avec Kotlin

Dans le métro 🚈, dans la forêt 🌳, à la montagne 🏔, une application n'a pas toujours accès à internet.

Dans cet article, nous allons voir comment prévenir l'utilisateur en cas de perte de connexion sur une application Android, et réagir en fonction de cela au niveau de notre logique applicative. Leeet's gooooo.

Au menu

  1. On va d'abord mettre en place la classe qui va écouter les changements du réseau
  2. Demander la permission internet
  3. Réagir aux changements du réseau

🥖Créer une classe NetworkManager

Commençons par créer une classe NetworkManager pour gérer ces changements de réseau

//NetworkManager.kt
class NetworkManager() {
    private val _isNetworkAvailable = MutableStateFlow(false)
    val isNetworkAvailable: StateFlow<Boolean> = _isNetworkAvailable.asStateFlow()
}

Comme vous voyez, on utilise MutableStateFlow pour stocker l'état du réseau, si vous ne connaissez pas le concept de StateFlow (qui ressemble à celui des LiveData), je vous invite à jeter un oeil directement ici :
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow

Maintenant que notre classe est créée avec notre variable isNetworkAvailable, on va se faire une petite fonction pour mettre à jour le nouvel état du réseau

//NetworkManager.kt

class NetworkManager() {
    ..

    private fun updateNetworkAvailability(newState: Boolean) {
        _isNetworkAvailable.value = newState
    }

}

Ça y est ! Tout est prêt pour gérer le temps réel, on va pouvoir maintenant s'attaquer à la logique du changement de réseau.

🤔 Demander la permission pour le réseau

Pour commencer, on va avoir besoin de la permission de l'utilisateur pour accéder à l'état de son réseau.

Pour ça, il suffit d'ajouter cette ligne dans le AndroidManifest.xml de votre projet.

//AndroidManifest.xml

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

📡 Écouter les changements de connexion

Maintenant que nous avons la classe et les permissions, la dernière chose à faire est d'écouter les changements et de mettre à jour notre variable isNetworkAvailable en fonction.

Pour cela, Android nous facilite le travail avec la classe ConnectivityManager.

Reading network state | Android Developers
Pour comprendre comment elle fonctionne, vous pouvez jeter un oeil ici

Grâce à cette classe, on va pouvoir maintenant écouter les changements de réseau, pour ça, on va faire 3 choses :

  • Créer une fonction createNetworkCallback pour écouter les changements de réseau
  • Appeler cette fonction dans notre init (le constructeur de notre classe) en y ajoutant une networkRequest pour vérifier l'accès à internet
  • Mettre à jour isNetworkAvailable en fonction du networkCallback
//NetworkManager.kt

class NetworkManager() {
    val context = YourApplication.appContext
    
    private lateinit var networkCallback: ConnectivityManager.NetworkCallback
    
    private val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager

    ..

    init {
        networkCallback = createNetworkCallback()
        
        val networkRequest = NetworkRequest.Builder()
            .addCapability(NET_CAPABILITY_INTERNET)
            .build()

        connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
    }

    private fun createNetworkCallback() = object : ConnectivityManager.NetworkCallback() {
        
        override fun onAvailable(network: Network) {
            
            val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
            
            val hasInternetCapability = networkCapabilities?.hasCapability(NET_CAPABILITY_INTERNET)

            if (hasInternetCapability == true) {
                updateNetworkAvailability(true)
            }
        }

        override fun onLost(network: Network) {
            updateNetworkAvailability(false)
        }
    }
    
    ..
}

C'est tout bon, il ne vous reste plus qu'à instancier la classe NetworkManager() à l'endroit où vous voulez puis faire réagir votre application en fonction de la variable isNetworkAvailable !

PS : Le code source de la classe est disponible en entier sur ce gist.

Soutenez notre travail ❤️

🔥 Suivez nous sur Instagram, Facebook, LinkedIn ou abonnez-vous à notre newsletter en devenant membre de notre blog :)