Android开发中WebView的缓存处理方式
当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹:
我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.
WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。
一、网页缓存
缓存构成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db
/data/data/package_name/database/webviewCache.db
综合可以得知 webview 会将我们浏览过的网页url已经网页文件(css、图片、js等)保存到数据库表中
缓存模式(5种)
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。
总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。
002 | private void initWebView() { |
003 | mWebView.getSettings().setJavaScriptEnabled( true ); |
004 | mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); |
005 | mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); |
007 | mWebView.getSettings().setDomStorageEnabled( true ); |
009 | mWebView.getSettings().setDatabaseEnabled( true ); |
010 | String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME; |
012 | Log.i(TAG, "cacheDirPath=" +cacheDirPath); |
014 | mWebView.getSettings().setDatabasePath(cacheDirPath); |
016 | mWebView.getSettings().setAppCachePath(cacheDirPath); |
018 | mWebView.getSettings().setAppCacheEnabled( true ); |
025 | public void clearWebViewCache(){ |
029 | deleteDatabase( "webview.db" ); |
030 | deleteDatabase( "webviewCache.db" ); |
031 | } catch (Exception e) { |
036 | File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME); |
037 | Log.e(TAG, "appCacheDir path=" +appCacheDir.getAbsolutePath()); |
039 | File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+ "/webviewCache" ); |
040 | Log.e(TAG, "webviewCacheDir path=" +webviewCacheDir.getAbsolutePath()); |
043 | if (webviewCacheDir.exists()){ |
044 | deleteFile(webviewCacheDir); |
047 | if (appCacheDir.exists()){ |
048 | deleteFile(appCacheDir); |
055 | package com.example.webviewtest; |
057 | import android.app.Activity; |
058 | import android.graphics.Bitmap; |
059 | import android.os.Bundle; |
060 | import android.util.Log; |
061 | import android.view.View; |
062 | import android.webkit.JsPromptResult; |
063 | import android.webkit.JsResult; |
064 | import android.webkit.WebChromeClient; |
065 | import android.webkit.WebSettings; |
066 | import android.webkit.WebSettings.RenderPriority; |
067 | import android.webkit.WebView; |
068 | import android.webkit.WebViewClient; |
069 | import android.widget.RelativeLayout; |
070 | import android.widget.TextView; |
071 | import android.widget.Toast; |
073 | public class MainActivity extends Activity { |
075 | private static final String TAG = MainActivity. class .getSimpleName(); |
076 | private static final String APP_CACAHE_DIRNAME = "/webcache" ; |
077 | private TextView tv_topbar_title; |
078 | private RelativeLayout rl_loading; |
079 | private WebView mWebView; |
083 | protected void onCreate(Bundle savedInstanceState) { |
084 | super .onCreate(savedInstanceState); |
085 | setContentView(R.layout.activity_main); |
090 | private void findView() { |
092 | tv_topbar_title = (TextView) findViewById(R.id.tv_topbar_title); |
094 | rl_loading = (RelativeLayout) findViewById(R.id.rl_loading); |
096 | mWebView = (WebView) findViewById(R.id.mWebView); |
100 | mWebView.setWebViewClient( new WebViewClient() { |
103 | public void onLoadResource(WebView view, String url) { |
105 | Log.i(TAG, "onLoadResource url=" +url); |
107 | super .onLoadResource(view, url); |
111 | public boolean shouldOverrideUrlLoading(WebView webview, String url) { |
113 | Log.i(TAG, "intercept url=" +url); |
115 | webview.loadUrl(url); |
121 | public void onPageStarted(WebView view, String url, Bitmap favicon) { |
123 | Log.e(TAG, "onPageStarted" ); |
125 | rl_loading.setVisibility(View.VISIBLE); |
129 | public void onPageFinished(WebView view, String url) { |
131 | String title = view.getTitle(); |
133 | Log.e(TAG, "onPageFinished WebView title=" + title); |
135 | tv_topbar_title.setText(title); |
136 | tv_topbar_title.setVisibility(View.VISIBLE); |
138 | rl_loading.setVisibility(View.GONE); |
142 | public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { |
144 | rl_loading.setVisibility(View.GONE); |
146 | Toast.makeText(getApplicationContext(), "" , |
147 | Toast.LENGTH_LONG).show(); |
151 | mWebView.setWebChromeClient( new WebChromeClient() { |
154 | public boolean onJsAlert(WebView view, String url, String message, JsResult result) { |
156 | Log.e(TAG, "onJsAlert " + message); |
158 | Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); |
166 | public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { |
168 | Log.e(TAG, "onJsConfirm " + message); |
170 | return super .onJsConfirm(view, url, message, result); |
174 | public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { |
176 | Log.e(TAG, "onJsPrompt " + url); |
178 | return super .onJsPrompt(view, url, message, defaultValue, result); |
182 | mWebView.loadUrl(url); |
185 | private void initWebView() { |
187 | mWebView.getSettings().setJavaScriptEnabled( true ); |
188 | mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); |
189 | mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); |
191 | mWebView.getSettings().setDomStorageEnabled( true ); |
193 | mWebView.getSettings().setDatabaseEnabled( true ); |
194 | String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME; |
196 | Log.i(TAG, "cacheDirPath=" +cacheDirPath); |
198 | mWebView.getSettings().setDatabasePath(cacheDirPath); |
200 | mWebView.getSettings().setAppCachePath(cacheDirPath); |
202 | mWebView.getSettings().setAppCacheEnabled( true ); |
208 | public void clearWebViewCache(){ |
212 | deleteDatabase( "webview.db" ); |
213 | deleteDatabase( "webviewCache.db" ); |
214 | } catch (Exception e) { |
219 | File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME); |
220 | Log.e(TAG, "appCacheDir path=" +appCacheDir.getAbsolutePath()); |
222 | File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+ "/webviewCache" ); |
223 | Log.e(TAG, "webviewCacheDir path=" +webviewCacheDir.getAbsolutePath()); |
226 | if (webviewCacheDir.exists()){ |
227 | deleteFile(webviewCacheDir); |
230 | if (appCacheDir.exists()){ |
231 | deleteFile(appCacheDir); |
240 | public void deleteFile(File file) { |
242 | Log.i(TAG, "delete file path=" + file.getAbsolutePath()); |
247 | } else if (file.isDirectory()) { |
248 | File files[] = file.listFiles(); |
249 | for ( int i = 0 ; i < files.length; i++) { |
250 | deleteFile(files[i]); |
255 | Log.e(TAG, "delete file no exists " + file.getAbsolutePath()); |
当前中小站点运营艰难
为支持本站可持续发展
『诚请您关闭广告屏蔽工具』