前言
先讲讲为什么会有这篇blog,话说前几天做个模块,要求是这样的:
做一个webview的页面,功能类似于微信发朋友圈一样,要求能上传本地图片到webview中进行展示,并按用户喜好添加和删除,当用户点击发布的时候,将这些图片上传至阿里云oss,收到oss响应后封装页面信息提交给服务器
技术要点
- webview与native的交互
- webview显示客户端本地图片的方式
- webview加载大量图片的问题(优化方案)
- 自定义关于webview的缓存系统
webview与native的交互
关于交互其实网上有很多文章,在之前我也写过一篇关于webview与native交互方案的blog: Android混合开发的入门和方案
因此在这个demo中我采用的也是JsBridge的方式来让webview与native进行通信,所以主要提一下其中一些坑:
- 使用JsBridge的方式,在子线程是无法发送消息给WebView的
- 如果webview要加载本地文件,必须设置mWebView.getSettings().setAllowFileAccess(true);
- 如果html文件存在于服务器中,就算你按照第二点设置了,那webview也无法读取本地文件,会报not allowed to load local resource(解决办法后面我会给出),这个坑异常深!!!
- 使用base64编码来让webview中img便签加载编码后的图片的异常(大坑)
webview显示客户端本地图片的方式
直接设置
拿到本地文件的路径,然后拼装便签,设置其src属性为”file://”+路径,webview就会自动去找此地址(“file://”是属性webview的一种协议,就像我们的http协议的道理)
//imgPaths是我们选择的那些图片的本地路径
private void adapterH5Data(List<String> imgPaths){
String result = "";
//拼装标签
for(int i=0;i<imgPaths.size();i++){
result += "<img src=\"file://"+imgPaths.get(i)+"\" height=\"70\" width=\"70\"/>";
}
//发送给webview容器
mWebView.callHandler("adapter",result,null);
}
那么在我们的html文件中,有一个这样的方法:
function adapter(pars){
//直接把native拼装好的html添加到id为info_img的便签里面
$("#info_img").prepend(pars);
}
Base64编码
base64编码大家应该都有接触过,还记得宝宝当年刚撸项目的时候,图片上传就是利用app把图片转化为base64,然后把这段字符串发送给服务器接收再进行解码,差点把老师气吐血。
那么这个方案,就是把目标路径的文件,通过base64编码编写成字符串,然后设置到img便签的src属性,这样img便可以显示出图片。