1. 用户上传文件
webChromeClient的onShowFileChooser这个方法,这将打开一个文件选择器,如果要取消这个请求则是调用filePathCallback.onReceiveValue(null)
2. webView调用JS方法
webView调用Js的基本格式是loadurl("JavaScript:method(参数)");
但是如果调用的js方法有值返回,则是如下写法: // 就是调用evaluateJavaScript方法回调
private void evaluateJavaScript(WebView webview){
webview.evaluateJavaScript("js方法名()",new ValueCallback<String>(){
@Override
public void onReceiveValue(String s)
Log.e("",s);
});
}
3. JS调用webView的方法
Java方法使用JavascriptInterface注解
@JavascriptInterface
public void show(string hello){
Toast.makeText().show();
}
注册JavaScriptInterface
webView.addJavaScriptInterface(this,"android");// 这里是做了一个映射,映射到JavaScript的android对象中
JavaScript调用android 方法 弹出对话框
function getFromAndroid(){
window.android.show("hello");
}
如果是调用的android 方法有返回值,则在最后调用的JavaScript处接收值就行了,var result = window.android.method(参数);
3. webView加载优化:
第一种方式尽量使一些资源本地化,因为最快的方式还是从本地读取资源。本地资源放在asset路径下,然后重写webviewClient的webResourceResponseShouldInterceptRequest(Webview webview,WebResourceRequest request)读取本地资源,建立cache controller机制,定期检查资源更新,保证本地资源是最细可用的。
第二种方式就是缓存,首先在websetting里面把相关的缓存设置打开,setAppCacheEnab(),setDomstroageEnable(),setDatabaseEnable(),最重要的设置缓存模式,setCacheModel();
因为不同的网络环境,我们要选择不同的缓存模式,默认情况下是websettings.LOAD_DEFAULT, 所以如果是网络好的情况下使用默认的方式,网络有问题是只能使用缓存的页面LOAD_CATCH_ONLY, 所以这里就要定期接受服务器通知更新缓存
第三种方式,就是前端要做的了,对JS做延迟加载。