Android学习之WebView使用总结

现在移动开发越来越快速,为了节约时间成本,获取项目开发中的竞争优势,越来越多的项目不得不用上混合开发,即与H5交互式开发,我们公司在项目中也大量采用这种开发模式,也因此产生了一些交互开发上的问题,今天借此总结一下,防止以后走坑。

交互式开发,说明白点就是WebView,xWalkView现在的使用还具有一些不稳定性,例如一些cpu的不支持,所以这里不做介绍,本文主要针对WebView在工作中的问题做一些总结。

1.首先是适配

WebView适配有两种方式

 webView = (WebView) findViewById(R.id.web_view);
 WebSettings settings = webView.getSettings();

一种是:

  settings.setUseWideViewPort(true); 
  settings.setLoadWithOverviewMode(true); 

第二种是:

settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

LayoutAlgorithm是一个枚举用来控制页面的布局,有三个类型:

1.NARROW_COLUMNS:可能的话使所有列的宽度不超过屏幕宽度

2.NORMAL:正常显示不做任何渲染

3.SINGLE_COLUMN:把所有内容放大webview等宽的一列中

推荐第一种方式。

2.编码,一般采用UTF-8编码

settings.setDefaultTextEncodingName("utf-8");

3.缓存,设置缓存路径,大小,缓存方式等

//缓存路径
 String cacheDirPath = getFilesDir().getAbsolutePath() + Constants.FILE_WEBVIEW;
 //设置是否打开。默认关闭,即,H5的缓存无法使用。
 webView.getSettings().setAppCacheEnabled(true);
 //开启数据库缓存
 webView.getSettings().setDatabaseEnabled(true);
 //开启DOM缓存
 webView.getSettings().setDomStorageEnabled(true);
 //设置缓存路径
 webView.getSettings().setDatabasePath(cacheDirPath);
 webView.getSettings().setAppCachePath(cacheDirPath);
 //根据是否有网络,来选择不同的缓存模式,有网请求网络,无网加载本地。
 if (NetWorkUtil.isConnectInternet(this)) {
            webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        } else {
            webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }
//设置缓存大小,这里是8M
webView.getSettings().setAppCacheMaxSize(8 * 1024 * 1024);

缓存模式:

LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

一般的设置就是网络的情况下请求网络获取,没用网络的情况下加载缓存数据。

4.清除缓存

清除webview缓存数据库

 this.deleteDatabase("webview.db");
 this.deleteDatabase("webviewCache.db");

清除缓存文件

            //WebView 缓存文件 
            File appCacheDir = new File(cacheDirPath);  

            //删除webview 缓存目录 
            if(appCacheDir .exists()){ deleteFile(appCacheDir ); }  

5.在onDestory()中移除WebView所添加的所有view,防止崩溃leak

@Override
    protected void onDestroy() {
        super.onDestroy();

        webView.removeAllViews();

    }

6.如何进行js交互

  webView.addJavascriptInterface(this, "android");
  settings.setJavaScriptEnabled(true);

具体请参考我的博客

7.WebViewClient监听事件的使用

 webView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                showLoading("正在加载...");
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                cancelLoading();

            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                //载入本地assets文件夹下面的错误提示页面404.html
// view.loadUrl("file:///android_asset/404.html");
            }
        });
 webView.loadUrl(Constants.RequestUrl.baseUrl + url);

好啦,就记得就这么多啦,记下来以后再项目中在遇到这种交互式问题,就简单多了。哈哈,总结完毕,一点多了,睡觉。

你可能感兴趣的:(android,webView,开发模式)