android--------WebView 实现缓存网页数据
WebView中存在著兩種緩存:網頁數據緩存(存儲打開過的頁面及資源),H5緩存(即AppCache)。
將我們瀏覽過的網頁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。
效果圖:
????????
?
根據百度首頁來測試的,有網的情況下加載,之后關閉網絡并結束進程在打開一樣可以看到先前看到過的網頁,當點擊沒打開過的網頁是則:
? ? ? ?
?
緩存的數據目錄默認在:data/data/包名/app_webview/Cache/ 下:
? ? ? ?
?
public class MainActivity extends Activity {private WebView webView;private String url = "https://wap.baidu.com/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}public void initView() {webView = (WebView) findViewById(R.id.activity_webview);webView.requestFocus();webView.setHorizontalScrollBarEnabled(false);webView.setVerticalScrollBarEnabled(false);initWebView();}@SuppressWarnings("deprecation")@SuppressLint("SetJavaScriptEnabled")private void initWebView() {webView.getSettings().setJavaScriptEnabled(true);// 設置 緩存模式if (NetUtils.isNetworkAvailable(MainActivity.this)) {webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);} else {webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);}// webView.getSettings().setBlockNetworkImage(true);// 把圖片加載放在最后來加載渲染 webView.getSettings().setRenderPriority(RenderPriority.HIGH);// 支持多窗口webView.getSettings().setSupportMultipleWindows(true);// 開啟 DOM storage API 功能webView.getSettings().setDomStorageEnabled(true);// 開啟 Application Caches 功能webView.getSettings().setAppCacheEnabled(true);onLoad();}@SuppressWarnings("deprecation")@SuppressLint("SetJavaScriptEnabled")public void onLoad() {try {webView.setWebViewClient(new WebViewClient() {@Overridepublic void onLoadResource(WebView view, String url) {Log.i("tag", "onLoadResource url=" + url); // 開始加載super.onLoadResource(view, url);}@Overridepublic boolean shouldOverrideUrlLoading(WebView webview,String url) {Log.i("tag", "intercept url=" + url);// 重寫此方法表明點擊網頁里面的鏈接還是在當前的webview里跳轉,不跳到瀏覽器那邊 webview.loadUrl(url);return true;}@Overridepublic void onPageFinished(WebView view, String url) {String title = view.getTitle(); // 得到網頁標題 Log.e("tag", "onPageFinished WebView title=" + title);}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {Toast.makeText(getApplicationContext(), "加載錯誤",Toast.LENGTH_LONG).show();}});webView.loadUrl(url);} catch (Exception e) {return;}}@Override// 設置回退// 覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {webView.goBack(); // goBack()表示返回WebView的上一頁面return true;} else {finish();}}/**** 防止WebView加載內存泄漏*/@Overrideprotected void onDestroy() {super.onDestroy();webView.removeAllViews();webView.destroy();}}?
AndroidManifest.xml 中加權限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>?
代碼未完全給出,要源碼直接下載即可
?
源碼點擊下載: https://github.com/DickyQie/android-webview
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的android--------WebView 实现缓存网页数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双11不过瘾?双十二低至半价继续抢,更有
- 下一篇: 原生js实现canvas气泡冒泡效果