【发布时间】:2022-01-05 04:15:11
【问题描述】:
在WebView的缓存模式的documentation中,在LOAD_DEFAULT的描述中说:
如果导航类型不强制执行任何特定行为,请在可用且未过期时使用缓存资源,否则从网络加载资源。
如何在android客户端设置web视图缓存的过期时间而不需要修改服务器端配置?
【问题讨论】:
标签: android kotlin caching webview
在WebView的缓存模式的documentation中,在LOAD_DEFAULT的描述中说:
如果导航类型不强制执行任何特定行为,请在可用且未过期时使用缓存资源,否则从网络加载资源。
如何在android客户端设置web视图缓存的过期时间而不需要修改服务器端配置?
【问题讨论】:
标签: android kotlin caching webview
使用 WorkManager 做到这一点, 创建定期工作管理器来调用您的“clearWebViewCache”函数(就像每天一样)
【讨论】:
使用基于 OkHttp 的自定义 Web 视图客户端怎么样?
试试这个: 添加okhttp客户端作为依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
接下来创建一个 OkHttp 拦截器,在这个拦截器中你可以定义你的缓存年龄:
import okhttp3.CacheControl
import okhttp3.Interceptor
import okhttp3.Response
import java.util.concurrent.TimeUnit
class CacheInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request())
val cacheControl = CacheControl.Builder()
.maxAge(1, TimeUnit.MINUTES) // 1 minute cache
.build()
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", cacheControl.toString())
.build()
}
}
实现它:
...
lateinit var wb: WebView
lateinit var okHttpClient: OkHttpClient
lateinit var cache: Cache
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val httpCacheDirectory = File(applicationContext.cacheDir, "http-cache")
val cacheSize = 10 * 1024 * 1024 // 10 MiB
val cache = Cache(httpCacheDirectory, cacheSize.toLong())
okHttpClient = OkHttpClient.Builder()
.addNetworkInterceptor(CacheInterceptor())
.cache(cache)
.build()
wb = findViewById(R.id.webView)
wb.webViewClient = object : WebViewClient() {
// API 21-
@SuppressWarnings("deprecation")
override fun shouldInterceptRequest(
view: WebView?,
url: String
): WebResourceResponse? {
return this.getNewResponse(url)
}
// API 21+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest
): WebResourceResponse? {
return getNewResponse(request.url.toString())
}
private fun getNewResponse(url: String): WebResourceResponse? {
return try {
val okHttpRequest: Request = Request.Builder().url(url).build()
val response: Response = okHttpClient.newCall(okHttpRequest).execute()
WebResourceResponse("", "", response.body!!.byteStream())
} catch (e: IOException) {
e.printStackTrace()
null
}
}
}
}
...
【讨论】: