1. 程式人生 > >Android構建一個通用的WebView(二):自定義的錯誤頁面、快取資料,離線瀏覽

Android構建一個通用的WebView(二):自定義的錯誤頁面、快取資料,離線瀏覽

概述
12.24追加的WebView功能包括:
1.支援載入網頁失敗時載入自定義的錯誤頁面
2.支援快取網頁資料,提供離線瀏覽

效果

   


介紹

WebView本身已自帶了快取功能,當首次載入網頁時會在/data/data/package_name目錄下生成databases與cache兩個資料夾。
WebView會將請求網頁的相關資訊儲存在databases/webviewCookiesChromium.db資料庫下的cookies表中,而實際的快取內容則儲存在cache/webviewCacheChromium目錄下。
WebView包括以下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,在兩種模式下都使用本地快取資料。

      

實現

1.將自定義的錯誤頁面放在assets資料夾下,然後重寫WebViewClient的onReceivedError方法:

@Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                view.loadUrl("file:///android_asset/errorPage.html");
            }

這樣一來載入網頁失敗時就會載入我們自定義的錯誤頁面。需要注意的是,當載入一個有ssl層的頁面,如https://money.183.com.cn/時,如果這個網站的安全證書在Android無法得到認證,WebView就會變成一個空白頁,而不會像PC瀏覽器中那樣跳出一個風險提示框,因此,當發生這種情況時,是會跳到WebViewClient的onReceivedSslError方法而非onReceivedError方法中,我們可以做如下處理簡單地接受所有證書:
@Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }

2.要實現快取網頁資料,提供離線瀏覽,我們需要在loadUrl方法之前先判斷一下網路狀態:
    private boolean accessNetworkState() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info == null) {
            displayNetworkErrorDialog();
            return false;
        } else {
            return true;
        }
    }

如果網路正常,則設定快取模式為LOAD_DEFAULT:
        if (accessNetworkState()) {
            wvCommon.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
            wvCommon.loadUrl(currentUrl);
        }

當正常瀏覽,在資料庫表cookies中生成記錄並在快取目錄webviewCacheChromium下生成快取資料後,在網路異常的情況下就可以使用將快取模式設為LOAD_CACHE_ELSE_NETWORK進行離線瀏覽了:
        root.findViewById(R.id.btn_dialog_ok).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dlgNetworkError.dismiss();
                wvCommon.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
                wvCommon.loadUrl(currentUrl);
            }
        });

原始碼

參考