How should I handle “No internet connection” with Retrofit on Android

前端 未结 8 921
一个人的身影
一个人的身影 2020-12-02 03:55

I\'d like to handle situations when there is no internet connection. Usually I\'d run:

ConnectivityManager cm =
    (ConnectivityManager)context.getSystemSer         


        
8条回答
  •  时光取名叫无心
    2020-12-02 04:57

    Here's what I did on API 29 & API 30:

    1. I created a simple WiFiService class that will hold the connectivityManager:

       class WifiService {
        private lateinit var wifiManager: WifiManager
        private lateinit var connectivityManager: ConnectivityManager
    
        companion object {
            val instance = WifiService()
        }
    
        fun initializeWithApplicationContext (context: Context) {
            wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
            connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        }
    
        // Helper that detects if online
        fun isOnline(): Boolean {
            val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
            if (capabilities != null) {
                when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> return true
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> return true
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> return true
                }
            }
            return false
          }
       }
    

    2. Create the ConnectivityInterceptor to check for internet access:

       class ConnectivityInterceptor: Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            if (!WifiService.instance.isOnline()) {
                throw IOException("No internet connection")
            } else {
                return chain.proceed(chain.request())
            }
         }
       }
    

    3. Finally use it in Retrofit2 as follows:

       class RestApi {
        private val okHttpClient by lazy {
            OkHttpClient.Builder()
                .addInterceptor(ConnectivityInterceptor())
                .build()
        }
    
        // Define all the retrofit clients
        private val restApiClient by lazy {
            Retrofit.Builder()
                .baseUrl("http://localhost:10000")
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
         }
    
         // ...
       }
    

提交回复
热议问题