Android WebView 實現緩衝網頁資料

來源:互聯網
上載者:User

標籤:scrollbar   extends   資源   alt   唯讀   views   dom   oba   ted   

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/";    @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"/>    

 

代碼未完全給出,要源碼直接下載即可

 

源碼下載:http://download.csdn.net/detail/dickyqie/9710400

 

Android WebView 實現緩衝網頁資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.