WebView、X5WebView技術點彙總
以下為Android使用x5webview過程中遇到的問題及解決辦法:
1.記憶體優化
webview動態載入,頁面銷燬時釋放webview
2.簽名後的apk無法與js互動
程式碼混淆檔案新增js監聽方法名
3.無法播放視訊
app專案中,設定了userAgent為"xxxapp_android",去掉原有的userAgent字串就會導致視訊無法播放,解決方法為獲取userAgent字串之後,拼接"/"+xxxapp_android
4.無法載入第三方網站
此第三方網站需依賴dom,設定webview支援dom :
webview.getSettings().setDomStorageEnabled(true)
5.webview與swiprefreshLayout衝突
監聽webview滑動事件 onScrollChangedListener,webview滾動到螢幕頂端,swiprefreshlayout設定為可用,其餘設定為不可用。webview滾動頂端webView.getScrollY()==0
6.將我們瀏覽過的網頁檔案(css、圖片、js等)儲存到資料庫表中,WebView快取
如果設定了快取,系統會預設生成兩份快取檔案:webview.db和webviewCache.db。至於路徑就要自己設定了,用系統預設路徑不好找到。
快取模式(5種)
1. LOAD_CACHE_ONLY: 不使用網路,只讀取本地快取資料
2. LOAD_DEFAULT: 根據cache-control決定是否從網路上取資料。
3. LOAD_CACHE_NORMAL: API level 17中已經廢棄, 從API level 11開始作用同LOAD_DEFAULT模式
4. LOAD_NO_CACHE: 不使用快取,只從網路獲取資料.
5. LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用快取中的資料。
建議的快取策略:
判斷是否有網路,有的話,使用LOAD_DEFAULT,無網路時,使用LOAD_CACHE_ELSE_NETWORK。
/** * 設定WebView 快取模式 */ public class test { private WebView mWebView; private static final String APP_CACAHE_DIRNAME = "/data/data/package_name/cache/webviewCache"; private void initWebView() { //設定支援js mWebView.getSettings().setJavaScriptEnabled(true); //設定渲染效果優先順序,高 mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); //設定快取模式 mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); String cacheDirPath = APP_CACAHE_DIRNAME; //設定資料庫快取路徑 mWebView.getSettings().setDatabasePath(cacheDirPath); //設定 應用 快取目錄 mWebView.getSettings().setAppCachePath(cacheDirPath); //開啟 DOM 儲存功能 mWebView.getSettings().setDomStorageEnabled(true); //開啟 資料庫 儲存功能 mWebView.getSettings().setDatabaseEnabled(true); //開啟 應用快取 功能 mWebView.getSettings().setAppCacheEnabled(true); } }
7.清webview快取
/**
* 清除WebView快取
*/
public void clearWebViewCache() {
/**清理Webview快取資料庫,快取檔案由程式自動生成
* /data/data/package_name/database/webview.db
* /data/data/package_name/database/webviewCache.db
**/
try {
//因為他們都是檔案,所以可以用io方式刪除,具體方法可以自己寫
deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");
} catch (Exception e) {
e.printStackTrace();
}
//WebView 快取檔案
File webviewCacheDir = new File(APP_CACAHE_DIRNAME);
//刪除webview 快取目錄
if (webviewCacheDir.exists()) {
//具體的方法自己寫
deleteFile(webviewCacheDir);
}
}