What about using a custom web view client based on OkHttp?
Try this:
add okhttp client as dependency:
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
Next create a OkHttp interceptor, In this interceptor you can define your cache age:
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()
}
}
Implement it:
...
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
}
}
}
}
...