其實webview加載資源的速度並不慢,可是若是資源多了,固然就很慢。圖片、 css 、 js 、 html 這些資源每一個大概須要 10-200ms ,通常都是 30ms 就 ok 了。不過webview是必須等到所有資源都完成加載,纔會進行渲染的,因此加載的速度很重要!從Google上咱們瞭解到,webview 加載頁面的順序是:先加載 html ,而後從裏面解析出 css 、 js 文件和頁面上的圖片資源進行加載。若是 webkit 的緩存裏面有,就不加載。加載完這些資源以後,就進行 css 的渲染和 js 的執行。 Css 的渲染通常不須要很長時間,幾十毫秒就 ok 。關鍵是 js 的執行,若是用了 jQuery ,則執行起來須要 5-6 秒。而在這段時間,若是不在 webview 裏設置背景,網頁部分是白色的,很難看。這是一個很糟糕的用戶體驗。因此若是用網頁佈局程序,最好別用那些龐大的 js 框架。最好使用原生的js寫業務腳本,以提高加載速度,改善用戶體驗。
Android 的 webview 是基於 webkit 內核的,webview 中集成了js與java互調的接口函數,經過addJavascriptInterface方法,能夠將Java的類註冊進webkit,給網頁上的js進行調用,並且還能夠經過loadUrl方法是給webkit傳遞一個uri,供瀏覽器來進行解析,實現Java和js交互。
要想運行網頁上的js腳本,webview必須設置支持Javascript
mWebview.getSettings().setJavaScriptEnabled(true);
而後是設置webview要加載的網頁:
web的網頁:webView.loadUrl("http://www.google.com");
本地的網頁:webView.loadUrl("file:///android_asset/XX.html"); //本地的存放在:assets文件夾中
webview作完基本的初始化後咱們還要要給它,加進一個回調的代理類JavaScriptInterface,並給它一個調用的名稱:ncp
mWebView.addJavascriptInterface(new JavaScriptInterface(), "ncp");
JavaScriptInterface能夠是一個普通的Java類,類實現的方法,都可被js回調:
final class JavaScriptInterface {
public int callOnJs() {
return 1000;
}
public void callOnJs2(String mode) {
//TODO
}
}
Java要調用js的方法,只需知道js的方法名稱便可:
mWebView.loadUrl("javascript:onSaveCallback()");
js 這邊就更簡單:
<script type="text/javascript">
window.onload = function(){
document.getElementById('btn_1').addEventListener('click', onBtnClick, false);
var _int_value = window.ncp.callOnJs();
alert("get int from java:" + _int_value );
}
function onBtnClick() {
window.ncp.callOnJs2("click");
}
</script>
Java和js交互有如下一些特色:
1.Java 調用 js 裏面的函數,速度並不使人滿意,大概一次一兩百毫秒吧,若是要作交互性很強的事情,這種速度會讓人瘋掉的。而反過來就不同了, js 去調 java 的方法,速度很快,基本上 40-50 毫秒一次。因此儘可能用 js 調用 java 方法,而不是 java 去調用 js 函數。
2.Java 調用 js 的函數,沒有返回值,而 Js 調用 java 方法,能夠有返回值。返回值能夠是基本類型、字符串,也能夠是對象。若是是字符串,有個很討厭的問題,第 3 點我會講的。若是是對象,這個對象會被轉換爲 js 的對象,直接能夠訪問裏面的方法。可是我不推薦 java 返回給 js 的是對象,除非是必須。由於 js 收到 java 返回的對象,會產生一些交換對象,而若是這些對象的數量增長到了 500 或 600 以上,程序就會出問題。因此儘可能返回基本數據類型或者字符串。
3.Js 調用 Java 的方法,返回值若是是字符串,你會發現這個字符串是 native 的,不能對它進行一些修改操做,好比想對它 substr ,取不到。怎麼解決呢?轉成 locale 的。使用 toLocaleString() 函數就能夠了。不過這個函數的速度並不快,轉化的字符串若是不少,將會很耗費時間。
本文由zhiweiofli編輯發佈,轉載請註明出處,謝謝。 javascript