關於webview的載入及快取的總結
阿新 • • 發佈:2019-01-31
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 =3.判斷是否連線網路: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");
/** * 檢測當前網路可用 * * @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