1. 程式人生 > >Android Webview 載入外部html時選擇載入本地的js,css等資原始檔

Android Webview 載入外部html時選擇載入本地的js,css等資原始檔

在使用WebView載入網頁的時候,有一些固定的資原始檔如js的jquery包,css,圖片等資源會比較大,如果直接從網路載入會導致頁面載入的比較慢,而且會消耗比較多的流量。所以這些檔案應該放在assets裡面同app打包。

要解決這個問題需要用到API 11(HONEYCOMB)提供的shouldInterceptRequest(WebView view, String url) 函式來載入本地資源。在API 21又將這個方法棄用了,是過載一個新的shouldInterceptRequest,需要的引數中將url替換成了成了request。

比如有一個圖片icon.png,這個圖片已經放在了assets中,現在載入了一個外部html,就需要直接把assets裡面的圖片拿出來載入而不需要重新從網路獲取。當然可以在html裡面將圖片連結換成file:///android_asset/icon.png,但是這樣這個html就不能在android ,ios,WAP中公用了。

實現程式碼:

webView.setWebViewClient(new WebViewClient() {

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                WebResourceResponse response = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
                    response = super.shouldInterceptRequest(view,url);
                    if (url.contains("icon.png")){
                        try {
                            response = new WebResourceResponse("image/png","UTF-8",getAssets().open("icon.png"));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
//                return super.shouldInterceptRequest(view, url);
                return  response;
            }

            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                WebResourceResponse response = null;
                response =  super.shouldInterceptRequest(view, request);
                if (url.contains("icon.png")){
                    try {
                        response = new WebResourceResponse("image/png","UTF-8",getAssets().open("icon.png"));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return response;
            }
}