1. 程式人生 > >WebView、X5WebView技術點彙總

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);
        }
    }