现在移动开发越来越快速,为了节约时间成本,获取项目开发中的竞争优势,越来越多的项目不得不用上混合开发,即与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);
好啦,就记得就这么多啦,记下来以后再项目中在遇到这种交互式问题,就简单多了。哈哈,总结完毕,一点多了,睡觉。