Android WebView 緩存


android很多情況是使用webView用來顯示界面,但是webview的加載速度略慢,想讓這個webview更快一些所以需要使用緩存,在沒有更新的時候使用緩存技術來提高速度。總體來講有兩個方案可以實現這個內容。1.用本地文件js,css,png替換網絡請求下來的文件,2.直接使用webview的緩存。

 

第一種方法用本地文件js,css,png替換網絡請求下來的文件是在webview的setWebViewClient里面的shouldInterceptRequest方法用本地文件進行替換。

        mWebView.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageFinished(WebView webView, String s) {
                super.onPageFinished(webView, s);
                mWebView.getSettings().setBlockNetworkImage(false);
         //加載完成時調用
            }

            //新加載WebView的方法
            @Override
            public boolean shouldOverrideUrlLoading(final WebView webView, final   String url) {
                Log.e("sys","url="+url);

                //判斷url
                if (!(url.startsWith("http") || url.startsWith("https"))) {
                    return true;
                }

                /**
                 * 推薦采用的新的二合一接口(payInterceptorWithUrl),只需調用一次
                 */
                final PayTask task = new PayTask(BaseWebActivity.this);
                boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
                    @Override
                    public void onPayResult(final H5PayResultModel result) {
                        final String url=result.getReturnUrl();
                        Log.e("sys","url="+ url);
                        switch (result.getResultCode()) {
                            /*
                               9000——訂單支付成功
                               8000——正在處理中
                               4000——訂單支付失敗
                               5000——重復請求
                               6001——用戶中途取消
                               6002——網絡連接出錯
                            */
                            case "4000":
                                webView.loadUrl("javascript:appCallJsShowOrder()");
                                Log.e("sys","4000");
                                break;
                            case "6001":
                                webView.loadUrl("javascript:appCallJsShowOrder()");
                                Log.e("sys","6001");
                                break;
                            case "6002":
                                webView.loadUrl("javascript:appCallJsShowOrder()");
                                Log.e("sys","6002");
                                break;
                            case "9000":
                                break;
                        }

                        }
                    }
                });

                /**
                 * 判斷是否成功攔截
                 * 若成功攔截,則無需繼續加載該URL;否則繼續加載
                 */
                if(!isIntercepted) {
                    Log.e("is","update");
                    webView.loadUrl(url);
                }
                return true;
            }


            //獲得下載列表
            @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(".js")||url.contains(".png")||url.contains(".css")){
                        Log.e("fileUrl",url);
                        String[] arr = StrUtil.getStrArr(url,"/");
                        String jsFileName = arr[arr.length-1];
                        String[] arrEnd = StrUtil.getStrArr(jsFileName,"\\.");
                        if (arr.length!=0){
                            if(arrEnd.length != 0) {

                                Log.e("arr",jsFileName);
                                if(jsFileName.equals("fastclick.min.js")){
                                    Log.e("fastclick","fastclick");
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("fastclick.min.js"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }

                                if(jsFileName.equals("geolocation.min.js")){
                                    Log.e("geolocation","geolocation");
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("geolocation.min.js"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }

                                if(jsFileName.equals("g2.min.js")){
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("g2.min.js"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }


                                if(jsFileName.equals("login_bg.5563a40.png")){
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("login_bg.5563a40.png"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                                if(jsFileName.equals("favicon-16x16.png")){
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("favicon-16x16.png"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                                if(jsFileName.equals("favicon-32x32.png")){
                                    try {
                                        return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("favicon-32x32.png"));
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                        }
                    }

                }
                return  response;
            }

            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                WebResourceResponse response = null;
                response =  super.shouldInterceptRequest(view, request);
                return response;
            }

            @Override
            public void onReceivedError(final WebView webView, int i, String s, String s1) {
                super.onReceivedError(webView, i, s, s1);
            }

            @Override
            public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
                super.onReceivedError(webView, webResourceRequest, webResourceError);
                Log.e("sys","onReceivedError webResourceError");

            }
        });

  2.首先設置webSetting設置成使用LOAD_DEFAULT這種緩存方式,數據從緩存中獲取還是從網絡中獲取根據H5頁面的參數判斷,這樣做的好處是可以動態的處理更新內容。再判斷版本是否清理緩存。

//設置webview屬性
private void initWebViewSettings() {
    WebSettings webSetting = webView.getSettings();
    webSetting.setJavaScriptEnabled(true);
    webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
    webSetting.setAllowFileAccess(true);
    webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
    webSetting.setSupportZoom(true);
    webSetting.setBuiltInZoomControls(true);
    webSetting.setUseWideViewPort(true);
    webSetting.setSupportMultipleWindows(true);
    // webSetting.setLoadWithOverviewMode(true);
    webSetting.setAppCacheEnabled(true);
    // webSetting.setDatabaseEnabled(true);
    webSetting.setDomStorageEnabled(true);
    webSetting.setGeolocationEnabled(true);
    webSetting.setDatabaseEnabled(true);
    webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
    webSetting.setTextZoom(100);

    webSetting.setBlockNetworkImage(true);
    // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
    webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
    webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
    webSetting.setCacheMode(WebSettings.LOAD_DEFAULT);
    String userAgent = webSetting.getUserAgentString().replace("Mobile","Snail");
    webSetting.setUserAgentString(userAgent);
    // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
    // settings 的設計
}


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        if (this.mWebView != null) {
            try
            {
                //在這里獲得版本號 清除緩存
         if(version!=lastVersion){
                  mWebView.clearCache(true);
                  context.deleteDatabase("webview.db");//刪除數據庫緩存
                  context.deleteDatabase("webviewCache.db");
          }
            }
            catch (Exception e) {

            }
            mWebView.destroy();
        }

    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM