1. 程式人生 > >關於webview的載入及快取的總結

關於webview的載入及快取的總結

1.WebView的介紹

    webview是Android中直接載入html頁面的控制元件,它為webApp帶來了新生命。那麼,他的出現也伴隨著很多問題的產生;今天就webview的載入及快取方面的知識做個總結,希望對大家有所幫助。
2.Webview的快取

webview的快取分為兩種:網頁資料快取和H5快取 ①網頁快取的結構: /data/data/package_name/cache/
/data/data/package_name/database/webview.db
/data/data/package_name/database/webviewCache.db
②H5快取結構: 根據setAppCachePath(String appCachePath)提供的路徑,在H5使用快取過程中生成的快取檔案。


1.配置使用者許可權:
 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 <uses-permissi on android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
2. webSettings的設定:
WebSettings webSettings = myWebView.getSettings();
//設定渲染的優先順序
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
// 開啟 DOM storage API 功能
webSettings.setDomStorageEnabled(true);
//開啟 database storage API 功能
webSettings.setDatabaseEnabled(true);
String cacheDirPath = 
getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME; //設定資料庫快取路徑 webSettings.setDatabasePath(cacheDirPath); //設定 Application Caches 快取目錄 webSettings.setAppCachePath(cacheDirPath); //開啟 Application Caches 功能 webSettings.setAppCacheEnabled(true); webSettings.setLoadWithOverviewMode(true); //設定WebView支援JavaScript webSettings.setJavaScriptEnabled(true); //設定可以訪問檔案 webSettings.setAllowFileAccess(true); //設定支援縮放 webSettings.setBuiltInZoomControls(true); webSettings.setDefaultTextEncodingName("UTF-8");
3.判斷是否連線網路:
/**
 * 檢測當前網路可用
*
 * @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo info = connectivity.getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            // 當前網路是連線的
if (info.getState() == NetworkInfo.State.CONNECTED) {
                // 當前所連線的網路可用
return true;
            }
        }
    }
    return false;
}
4.針對網路狀況採取不同的快取策略:
if (isNetworkAvailable(getApplicationContext())) {
    //有網路連線,設定預設快取模式
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
} else {
    //無網路連線,設定本地快取模式
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
在有網路連線的時候,採取預設快取模式(根據cache-control決定是否從網路上取資料。)
WebSettings.LOAD_DEFAULT
在無網路連線的時候,採取
WebSettings.LOAD_CACHE_ELSE_NETWORK
只要本地有,無論是否過期,或者no-cache,都使用快取中的資料。如:m.taobao.com的cache-control為no-cache,在模式LOAD_DEFAULT下,無論如何都會從網路上取資料,如果沒有網路,就會出現錯誤頁面;在LOAD_CACHE_ELSE_NETWORK模式下,無論是否有網路,只要本地有快取,都使用快取。本地沒有快取時才從網路上獲取。

3.WebView的記憶體洩漏

首先宣告,webview如果不做任何處理的話,會存在記憶體洩漏的風險;規範的程式碼,一般對webview都做了防止OOM的處理的。

1.先從佈局下手,動態建立WebView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.zhangxing.webviewcachedemo.MainActivity">
   <LinearLayout
android:id="@+id/webview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
   </LinearLayout>
</RelativeLayout>
在程式碼中動態建立
webViewLayout = (LinearLayout) findViewById(R.id.webview_layout);
myWebView = new WebView(getApplicationContext());
webViewLayout.addView(myWebView);
2.在OnDestroy()中銷燬
@Override
protected void onDestroy() {
    super.onDestroy();
    myWebView.removeAllViews();
    myWebView.destroy();
}

4.關於webview載入的重點回顧 1.設定對JS的支援
//設定WebView支援JavaScript
webSettings.setJavaScriptEnabled(true);
2.設定通過JS開啟新視窗的支援:
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
myWebView.requestFocus();
3.為webview設定webChromClient,一般主要處理指令碼的執行,或者progress的執行
myWebView.setWebChromeClient(new WebChromeClient(){
    @Override
public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        if(newProgress == 100){
            if(dialog != null && dialog.isShowing()){
                dialog.dismiss();
            }
        }else{
            if(dialog == null){
                dialog = new ProgressDialog(MainActivity.this);
                dialog.setTitle("正在載入中.....");
                dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                dialog.setProgress(newProgress);
                dialog.show();
            }else{
                dialog.setProgress(newProgress);
            }
        }
    }
});
4.為webview設定webviewClient,主要處理關於頁面跳轉,頁面請求等操作
/**
 * WebViewClient幫助webView處理一些頁面控制和請求通知
* 當點選webview控制元件中的連結時,在這裡設定顯示在webview,否則,會在瀏覽器開啟
*/
myWebView.setWebViewClient(new WebViewClient() {
    @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //設定網頁在webview控制元件中開啟,false在瀏覽器中開啟
view.loadUrl(url);
        return true;
    }
});
好了,今天就到此為此,我是張星,歡迎您的關注,後期章節更精彩,一色的實戰中的精華。傳送門地址:http://download.csdn.net/detail/zhangxing52077/9714891