如何解决添加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 举报,一经查实,本站将立刻删除。