转载:安卓使用WebView清除缓存

Android 清除WebView缓存
最近项目中需要用WebView显示内容,需要使用JavaScript去交互,但是每次加载都加载到了缓存的数据,这里记录一下如何去清除WebView缓存。
首先要了解一些概念。

WebView的缓存可以分为页面缓存和数据缓存:

1,页面缓存: >指加载一个网页时的html、JS、CSS等页面或者资源数据。 >这些缓存资源是由于浏览器的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。 >缓存的索引存放在/data/data/package_name/databases下。 >文件存放在/data/data/package_name/cache/xxxwebviewcachexxx下。

2,数据缓存 : >数据缓存分为AppCache和DOM Storage两种。 >这些缓存资源是由开发者的直接行为而产生,所有的缓存数据都由开发者直接完全地掌控。 >Android中Webkit使用一个db文件来保存AppCache数据(my_path/ApplicationCache.db) >Android中Webkit会为DOM Storage产生两个文件(my_path/localstorage/http_h5.m.taobao.com_0.localstorage和my_path/localstorage/Databases.db)。

那既然了解了,怎么清除呢:
以下是百度出来的答案:

1.webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 2.context.deleteDatabase(“WebView.db”); 3.context.deleteDatabase(“WebViewCache.db”);
4.webView.clearCache(true); 
6.webView.clearFormData(); 
7.getCacheDir().delete(); 
8.用File的delete方法删除缓存文件夹;
    
    
  • 1
  • 2
  • 3
  • 4
  • 5

老实说,对我的问题,没多大用,还是那句话,有事请Google
其实如果你只是想要每次用webView.loadUrl(url)加载新的页面显示,那么调用webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)就可以实现了,并不需要去删除缓存文件什么的。
但是我的项目中使用了JavaScript的交互,而JavaScript的加载是通过头文件去获取加载的,所以每次我去获取新的页面的时候,虽然页面是新的,但是头文件中的数据还是old的,所以每次加载到的js都是old的。那么如何去做呢?
上面提到这个头文件是浏览器HTTP相应头去获取的,开发者只能间接的影响,并不能控制。
所以单独的webView.clearCache(true)是不能成功的,还需要清除webView的Cookie才行。
所以我最终的解决方法是在Activity的onDestroy()方法中添加如下代码:

@Override
protected void onDestroy() {
    super.onDestroy();
    //清空所有Cookie
    CookieSyncManager.createInstance(QzmobileApp.getContext());  //Create a singleton CookieSyncManager within a context
    CookieManager cookieManager = CookieManager.getInstance(); // the singleton CookieManager instance
    cookieManager.removeAllCookie();// Removes all cookies.
    CookieSyncManager.getInstance().sync(); // forces sync manager to sync now

    webView.setWebChromeClient(null);
    webView.setWebViewClient(null);
    webView.getSettings().setJavaScriptEnabled(false);
    webView.clearCache(true);
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

CookieSyncManager已经@Deprecated,但是requires API level 21,所以……
PS:其实最好是把清除缓存的代码都封装到一个类,然后调用静态方法即可。
大家有类似问题的可以试试,有问题的小伙伴请留言哈~

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

Android 清除WebView缓存
最近项目中需要用WebView显示内容,需要使用JavaScript去交互,但是每次加载都加载到了缓存的数据,这里记录一下如何去清除WebView缓存。
首先要了解一些概念。

WebView的缓存可以分为页面缓存和数据缓存:

1,页面缓存: >指加载一个网页时的html、JS、CSS等页面或者资源数据。 >这些缓存资源是由于浏览器的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。 >缓存的索引存放在/data/data/package_name/databases下。 >文件存放在/data/data/package_name/cache/xxxwebviewcachexxx下。

2,数据缓存 : >数据缓存分为AppCache和DOM Storage两种。 >这些缓存资源是由开发者的直接行为而产生,所有的缓存数据都由开发者直接完全地掌控。 >Android中Webkit使用一个db文件来保存AppCache数据(my_path/ApplicationCache.db) >Android中Webkit会为DOM Storage产生两个文件(my_path/localstorage/http_h5.m.taobao.com_0.localstorage和my_path/localstorage/Databases.db)。

那既然了解了,怎么清除呢:
以下是百度出来的答案:

1.webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 2.context.deleteDatabase(“WebView.db”); 3.context.deleteDatabase(“WebViewCache.db”);
4.webView.clearCache(true); 
6.webView.clearFormData(); 
7.getCacheDir().delete(); 
8.用File的delete方法删除缓存文件夹;
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

老实说,对我的问题,没多大用,还是那句话,有事请Google
其实如果你只是想要每次用webView.loadUrl(url)加载新的页面显示,那么调用webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)就可以实现了,并不需要去删除缓存文件什么的。
但是我的项目中使用了JavaScript的交互,而JavaScript的加载是通过头文件去获取加载的,所以每次我去获取新的页面的时候,虽然页面是新的,但是头文件中的数据还是old的,所以每次加载到的js都是old的。那么如何去做呢?
上面提到这个头文件是浏览器HTTP相应头去获取的,开发者只能间接的影响,并不能控制。
所以单独的webView.clearCache(true)是不能成功的,还需要清除webView的Cookie才行。
所以我最终的解决方法是在Activity的onDestroy()方法中添加如下代码:

@Override
protected void onDestroy() {
    super.onDestroy();
    //清空所有Cookie
    CookieSyncManager.createInstance(QzmobileApp.getContext());  //Create a singleton CookieSyncManager within a context
    CookieManager cookieManager = CookieManager.getInstance(); // the singleton CookieManager instance
    cookieManager.removeAllCookie();// Removes all cookies.
    CookieSyncManager.getInstance().sync(); // forces sync manager to sync now

    webView.setWebChromeClient(null);
    webView.setWebViewClient(null);
    webView.getSettings().setJavaScriptEnabled(false);
    webView.clearCache(true);
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

CookieSyncManager已经@Deprecated,但是requires API level 21,所以……
PS:其实最好是把清除缓存的代码都封装到一个类,然后调用静态方法即可。
大家有类似问题的可以试试,有问题的小伙伴请留言哈~

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

猜你喜欢

转载自blog.csdn.net/record_my_world/article/details/81567236