【问题标题】:set expiration time for WebView cache in android在android中设置WebView缓存的过期时间
【发布时间】:2022-01-05 04:15:11
【问题描述】:

WebView的缓存模式documentation中,在LOAD_DEFAULT的描述中说:

如果导航类型不强制执行任何特定行为,请在可用且未过期时使用缓存资源,否则从网络加载资源。

如何在android客户端设置web视图缓存的过期时间而不需要修改服务器端配置?

我还查看了以下有用的链接:link1link2link3

【问题讨论】:

    标签: android kotlin caching webview


    【解决方案1】:

    使用 WorkManager 做到这一点, 创建定期工作管理器来调用您的“clearWebViewCache”函数(就像每天一样)

    【讨论】:

    • clearCache 方法清除应用程序中其他 Web 视图使用的数据。
    【解决方案2】:

    使用基于 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
                    }
                }
            }
        }
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2021-09-11
      • 2011-10-31
      • 2015-02-15
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2011-04-15
      • 2012-03-18
      相关资源
      最近更新 更多