一、需求:
后台说加载HTML的包时间太长,太卡,让把所有的HTML包放到前台;
在之前处理iOS的时候,使用的是file://协议,有些内容和样式加载不出来,H5那边说需要用http://协议来加载;
所以在iOS上就采用搭建本地服务器,通过本地服务器设置的端口号加载本地的HTML文件路径;
二、处理过程:
安卓最简单的加载本地HTML的方法是:webView.loadUrl("file:///android_asset/HtmlFileTT/index.html");
加载之后,发现与iOS的情况一样,也是有些内容和样式加载不出来;
然后我也打算用iOS搭建本地服务器的这个思路,所以使用了nanohttpd,但在加载本地HTML路径上,水平不够,没能实现。
最后咨询了其他安卓大牛,发现问题很好解决,主要是是因为本地HTML里面有跨域的请求 但是原生webview需要设置之后才能实现跨域请求;解决方法是设置WebSettings,代码如下:
try {//本地HTML里面有跨域的请求 原生webview需要设置之后才能实现跨域请求
if (Build.VERSION.SDK_INT >= 16) {
Class<?> clazz = webView.getSettings().getClass();
Method method = clazz.getMethod(
"setAllowUniversalAccessFromFileURLs", boolean.class);
if (method != null) {
method.invoke(webView.getSettings(), true);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
webView.loadUrl("file:///android_asset/HtmlFileTT/index.html");
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
}
});
PS 还有一个问题
因为刚接触Android,在一开始用webView.loadUrl("file:///android_asset/HtmlFileTT/index.html"); 加载本地HTML文件时,加载出来的文字都是那种HTML的代码,一开始以为是编码格式的问题,
webView.getSettings().setDefaultTextEncodingName("utf-8");//文本编码
通过上述方法设置发现还是没有解决问题,最后加上下面这句才解决问题:
webView.getSettings().setDefaultTextEncodingName("utf-8");//文本编码
webView.setDomStorageEnabled(true);//设置DOM存储已启用(注释后文本显示变成js代码)