webview
,用網頁來佈局。
Android
的
webview
是基於
webkit
內核,不過他的運行效果和
firefox
上如出一轍,因此寫的時候都是先用
firefox
測試,測試
OK
了再放到程序裏面看效果,基本上不會有什麼問題。其實
android
的
webview
跟
iphone
的
webview
差很少,
iphone
上的
webview
比
android
上的強大多了。
談一下研究
webview
的一些成果:
一.
加載資源的速度不慢,可是資源多了,就很慢。圖片、
css
、
js
、
html
這些資源每一個大概須要
10-200ms
,通常都是
30ms
就
ok
了。若是一個頁面上的資源不少,就很浪費時間。
二.
Js
和
css
的執行速度。開始的時候,個人頁面都是用
js
生成
DOM
,添加樣式等也用
js
添加。後來發現,加載一個頁面竟然要
5-6
秒。而後我就懷疑是否是
js
的執行效率不高,而後就把能用
css
的地方都用
css
,能直接寫到
html
上的就不用
js
動態生成。結果,速度並無多大的提高,最多提高了
1
秒。看來,
Js
的執行速度雖然比不上
css
,可是還不至於慢到那種程度。那會是什麼緣由使得頁面加載速度這麼慢?通過仔細的排查,最終發現,是由於我用了
jQuery
框架。
Webview
加載頁面的順序是這樣的:先加載
html
,而後從裏面解析出
css
、
js
文件和頁面上寫死的圖片資源進行加載,若是
webkit
的緩存裏面有,就不加載。加載完這些資源以後,就進行
css
的渲染和
js
的執行。
Css
的渲染通常不須要很長時間,幾十毫秒就
ok
。關鍵是
js
的執行,若是用了
jQuery
,則執行起來須要
5-6
秒。而在這段時間,若是不在
webview
裏設置背景,網頁部分是白色的,很難看。這是一個很糟糕的用戶體驗。因此若是用網頁佈局程序,最好別用很大的
js
框架。
三.
網頁和
Java
之間的互調。這個功能是
iphone
裏面就有的,網上也有不少資料,能夠告訴咱們怎麼作,這些都是很簡單、很基本的。我研究了一段時間,總結一下:
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()
函數就能夠了。不過這個函數的速度並不快,轉化的字符串若是不少,將會很耗費時間。
四.
網頁上拖動元素。網頁上有一個
div
,想要拖動它到另一個地方,怎麼作?若是用
PC
上的網頁作法,監聽
onmousedown
、
onmousemove
和
onmouseup
就能夠了。可是在手機上,事件模型就不同了。在網頁上點擊,拖動,而後釋放,手離開屏幕的時候,
webview
纔會觸發
onmousedown
、
onmousemove
、
onmouseup
事件。因此,要想拖動,不能這麼作。這個問題困擾我很長時間,後來發現
iphone
上的作法,才解決了。
Iphone
上的
webview
有專爲觸摸屏設計的事件
ontouchstart
、
ontouchmove
、
ontouchend
,這幾個事件的響應是實時的,就能解決拖動的問題了。
五.
一些小問題。
Webview
裏面的網頁,若是有
input
,須要輸入,可是點上去卻沒反應,輸入法不出來。這種狀況是由於
webview
沒有獲取焦點。須要在
java
裏面給
webview
設置一下
requestFocus()
就好了。
六.
Android
上的
webview
和
iphone
的
webview
區別。目前爲止,我發現的區別有這麼幾個:
1
.
Android
上,
webview
不支持多點觸控,沒有
ongesture
系列事件,而
iphone
上有。
2
.
Android
上的
webview
不支持透明,
iphone
上能夠