WebView踩坑系列(一)

WebVeiw的缓存清理

webView的缓存有两种形式,页面内容缓存以及账号Cookie缓存,所以缓存清理分两种形式。情形一:例如某个app软件切换账号后发现用户界面显示的还是之前一个用户的数据,这时需要使用Cookie清理;另一种情形是,第一次加载网页时是一个样式,当前端修改网页的样式之后,如果不进行缓存清理,可能加载的还是第一次加载的样式,这时需要进行内容缓存清理。

一:Cookie缓存清理
在切换账号的时候,页面可能会保存上一个账号的信息,可以使用下面的方法进行缓存清理。
    @SuppressWarnings("deprecation")
    public static void clearCookies(Context context, WebView webView){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            CookieManager.getInstance().removeAllCookies(null);
            CookieManager.getInstance().flush();
        } else{
            CookieSyncManager cookieSyncMngr=CookieSyncManager.createInstance(context);
            cookieSyncMngr.startSync();
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.removeAllCookie();
            cookieSyncMngr.stopSync();
            cookieSyncMngr.sync();
        }
     }
二:内容缓存清理

webview缓存的内容主要包括网页中的css渲染、图片和javascript
交互。

在webView的属性设置里面:

缓存模式(5种)

LOAD_DEFAULT: 默认的缓存使用模式。如果没有使用setCacheMode方法,当内存资源可用且不过期,则从内存中获取资源;否则从网络加载资源。使用{ @link # setCacheMode }。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_CACHE_ELSE_NETWORK:当内存资源可用时,无论是否过期,都从内存中获取;否则从网络上获取。

总结:当设置cacheMode为LOAD_NO_CACHE时,该状态下不使用缓存,当cacheMode设置为其他状态时,从内存中读取资源。

属性设置如下:

public void setFeathue(){
    settings.setCacheMode(WebSettings.LOAD_DEFAULT);
    //cacheMode可以设置其他属性,除了LOAD_NO_CACHE之外
        .
        .
        .
    settings.setDatabaseEnabled(true);
    settings.setDomStorageEnabled(true);
    settings.setAppCacheEnabled(true);
    settings.setAppCachePath(WEB_APP_CACHE_PATH);
    settings.setDatabasePath(WEB_DATA_CACHE_PATH);
}

清除缓存代码如下:

     public void clearWebViewCache(){  

            //清理Webview缓存数据库  
            deleteDatabase("webview.db");   
            deleteDatabase("webviewCache.db");  

            File cacheFile = new File(getFilesDir().getAbsolutePath()+WEB_APP_CACHE_PATH);
        File dataFile = new File(getCacheDir().getAbsolutePath()+WEB_DATA_CACHE_PATH);
        if(cacheFile.exists()){
            deleteFile(cacheFile);
        }
        if(dataFile.exists()){
            deleteFile(dataFile);
        }
     }  

    /** 
     * 删除文件或文件夹 
     * @param file 
     */  
     public void deleteFile(File file) {     
        if (file.exists()) {  
            if (file.isFile()) {  
                file.delete();  
            } else if (file.isDirectory()) {  
                File files[] = file.listFiles();  
                for (int i = 0; i < files.length; i++) {  
                    deleteFile(files[i]);  
                }  
            }  
            file.delete();  
        } 
    }  

以上为webview清除缓存方法,若有不足之处欢迎指正,也欢迎大家给我留言,共同探讨问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 UniApp 中,要在 WebView 中实现返回上一页的功能,可以通过以下步骤来实现: 1. 在使用 WebView 的页面中,引入 `uni.navigateBack()` 方法,该方法用于返回上一页。 2. 在 WebView 页面中,监听 WebView 的回退事件。可以通过 `onmessage` 或 `postMessage` 方法来实现。 3. 在 WebView 页面中,当需要返回上一页时,通过 `window.postMessage()` 方法向父页面发送消息。 4. 在父页面中,监听 WebView 页面发送的消息,并调用 `uni.navigateBack()` 方法实现返回上一页的功能。 下面是一个示例代码: WebView 页面中的代码: ```html <template> <web-view src="https://example.com" @message="handleMessage"></web-view> </template> <script> export default { methods: { handleMessage(event) { // 监听 WebView 页面发送的消息 if (event.detail.data === 'back') { // 当接收到消息为 'back' 时,调用 uni.navigateBack() 返回上一页 uni.navigateBack() } } } } </script> ``` 父页面中的代码: ```html <template> <view> <button @click="openWebView">打开 WebView</button> </view> </template> <script> export default { methods: { openWebView() { uni.navigateTo({ url: '/pages/webview/index' }) } }, onmessage(event) { // 监听 WebView 页面发送的消息 if (event.detail.data === 'back') { // 当接收到消息为 'back' 时,调用 uni.navigateBack() 返回上一页 uni.navigateBack() } } } </script> ``` 这样,在 WebView 页面中,当需要返回上一页时,可以通过 `window.postMessage('back')` 方法向父页面发送消息,父页面监听到消息后,调用 `uni.navigateBack()` 方法即可实现返回上一页的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值