添加Internet连接拦截器Retrofit 2-Android时,缓存无法正常工作

问题描述

我正在尝试使用Retrofit和OkHttp通过缓存实现Internet连接拦截器。

添加Internet连接拦截器,缓存工作正常,但是当我向OkHttp Client添加Internet连接拦截器时,Internet连接拦截器工作正常,但是缓存不起作用。

它们分别工作正常,但是当我将缓存和Internet Interceptor一起添加时,缓存不起作用并且Internet Connection拦截器起作用。

这是我已经完成的工作:

val cacheSize = (5 * 1024 * 1024).toLong()
val myCache = Cache(context!!.cacheDir,cacheSize)

val okHttpClient = OkHttpClient.Builder()
                .cache(myCache)
                .addInterceptor(offlineInterceptor)
                .addNetworkInterceptor(onlineInterceptor)
                .addInterceptor(NoConnectionInterceptor(context))
                .build()


Retrofit.Builder()
         .baseUrl(Constants.REGISTRATION_BASE_URL)
         .client(okHttpClient)
         .addConverterFactory(GsonConverterFactory.create())
         .build()

当我删除NoConnectionInterceptor(context)缓存时工作正常

 var onlineInterceptor: Interceptor = object : Interceptor {
        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain): Response {
            val response: Response = chain.proceed(chain.request())
            val maxAge =
                60 // read from cache for 60 seconds even if there is internet connection
            return response.newBuilder()
                .header("Cache-Control","public,max-age=$maxAge")
                .removeHeader("Pragma")
                .build()
        }
    }

    var offlineInterceptor: Interceptor = object : Interceptor {
        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain): Response {
            var request: Request = chain.request()
            if (!hasNetwork()!!) {
                val maxStale = 60 * 60 * 24 * 30 // Offline cache available for 30 days
                request = request.newBuilder()
                    .header("Cache-Control",only-if-cached,max-stale=$maxStale")
                    .removeHeader("Pragma")
                    .build()
            }
            return chain.proceed(request)
        }
    }

NoConnectionInterceptor

@Singleton
class NoConnectionInterceptor @Inject constructor(private val context: Context) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        return if (!isConnectionOn()) {
            throw NoConnectivityException()
        } else if (!isInternetAvailable()) {
            throw NoInternetException()
        } else {
            chain.proceed(chain.request())
        }
    }

    private fun isConnectionOn(): Boolean {
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            val network = connectivityManager.activeNetwork
            val connection = connectivityManager.getNetworkCapabilities(network)
            return connection != null && (
                    connection.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                            connection.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
        } else {
            val activeNetwork = connectivityManager.activeNetworkInfo
            if (activeNetwork != null) {
                return (activeNetwork.type == ConnectivityManager.TYPE_WIFI ||
                        activeNetwork.type == ConnectivityManager.TYPE_MOBILE)
            }
            return false
        }
    }

    private fun isInternetAvailable(): Boolean {
        return try {
            val timeoutMs = 1500
            val sock = Socket()
            val sockaddr = InetSocketAddress("8.8.8.8",53)

            sock.connect(sockaddr,timeoutMs)
            sock.close()

            true
        } catch (e: IOException) {
            false
        }

    }

    class NoConnectivityException : IOException() {
        override val message: String
            get() = "No network available,please check your WiFi or Data connection"
    }

    class NoInternetException : IOException() {
        override val message: String
            get() = "No internet available,please check your connected WIFi or Data"
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)