android--------WebView 實現緩存網頁數據

WebView中存在着兩種緩存:網頁數據緩存(存儲打開過的頁面及資源),H5緩存(即AppCache)。css

將咱們瀏覽過的網頁url已經網頁文件(css、圖片、js等)保存到數據庫表中html

 

緩存模式(5種)java


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,都使用緩存中的數據。android


如:www.taobao.com的cache-control爲no-cache,在模式LOAD_DEFAULT下,不管如何都會從網絡上取數據,若是沒有網絡,就會出現錯誤頁面;在LOAD_CACHE_ELSE_NETWORK模式下,不管是否有網絡,只要本地有緩存,都使用緩存。本地沒有緩存時才從網絡上獲取。
www.360.com.cn的cache-control爲max-age=60,在兩種模式下都使用本地緩存數據。git



總結:根據以上兩種模式,建議緩存策略爲,判斷是否有網絡,有的話,使用LOAD_DEFAULT,無網絡時,使用LOAD_CACHE_ELSE_NETWORK。github

效果圖:web

 

 

        

根據百度首頁來測試的,有網的狀況下加載,以後關閉網絡並結束進程在打開同樣能夠看到先前看到的網頁,當點擊沒打開過的網頁是則:數據庫

       

 

緩存的數據目錄默認在:data/data/包名/app_webview/Cache/ 下:瀏覽器

       

 

public class MainActivity extends Activity {

    private WebView webView;
    private String url = "https://wap.baidu.com/";

    @Override
    protected 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() {

                @Override
                public void onLoadResource(WebView view, String url) {

                    Log.i("tag", "onLoadResource url=" + url); // 開始加載
                    super.onLoadResource(view, url);
                }

                @Override
                public boolean shouldOverrideUrlLoading(WebView webview,
                        String url) {

                    Log.i("tag", "intercept url=" + url);
                    // 重寫此方法代表點擊網頁裏面的連接仍是在當前的webview裏跳轉,不跳到瀏覽器那邊
                    webview.loadUrl(url);

                    return true;
                }

                @Override
                public void onPageFinished(WebView view, String url) {

                    String title = view.getTitle(); // 獲得網頁標題

                    Log.e("tag", "onPageFinished WebView title=" + title);

                }

                @Override
                public 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加載內存泄漏
     */
    @Override
    protected 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

相關文章
相關標籤/搜索