Android混合開發,html5自己主動更新爬過的坑
如今使用混合開發的公司越來越多,盡管出現了一些新技術,比方Facebook的react native、阿裏的weex,但依舊阻擋不了一些公司採用h5的決心。當然,這也是從多方面考慮的選擇。
在三年前就使用過html5混合開發,當時做的是一款貴金屬軟件,漲跌五線譜、乾坤交易,還有各個股市的信息,那時候還是上波牛市爆發的前夕,哎。。。
近期公司讓用h5混合開發。一些頁面和功能有h5分擔,最初時候放在本地assets目錄下,後來因為前端同事頻繁改動和更新。再加上數據安全方面考慮,決定把包放在server。採用接口返回字段,推斷是否須要下載更新。接下來就談下開發中遇到的幾個坑。給自己做個筆記,也分享給須要的朋友。
首坑:Android系統
對於h5的混合開發,Android系統就是個大坑,三年前接入h5點時候,那時候好多手機卡的跟ppt似的,4.0後Google進行了一些優化,效率上確實好了非常多。但後面又來了一系列巨坑。比方4.3之前一個內核,4.3一個單獨內核,4.3之後又是一個內核,原生的WebView沒法做到總體兼容,最後採取了一個方案。使用大企鵝的x5內核,長處例如以下:
- 裏面類名和方法名,和原生的名稱差點兒是一樣的,使用更方便
- QQ和微信都是採用x5內核,內核共享。不須要單獨下載
- 兼容性相對較好
二坑:DownloadManager。
最初的方案是採用系統下類DownloadManager,既然是系統提供的,非常多碼友肯定認為非常OK的。可是爆破部隊瞎搞,三星的手機系統卻把DownloadManager的api刪了。這尼瑪就惡心了,你還是繼續玩爆炸吧。。。
三坑:webview載入不顯示
之前放在assets的時候。頁面顯示的非常6,換成下載到本地讀取,竟然不顯示了,打印下路徑,沒問題。那就能夠確定問題出在了載入過程了。查了下資料發現。能夠是用loadData。這樣的方法須要先將html文件讀取出來。以字符串傳入loadData,能夠展示頁面,可是不會引用css、js等文件。也能夠使用loadUrl。只是須要註意,這裏因為是使用本地數據,所以傳入的url須要做些處理,比如:
- 假設html文件存於assets:則加前綴:file:///android_asset/
- 假設html文件存於sdcard:則加前綴:content://com.android.htmlfileprovider/sdcard/
PS:content前綴可能導致異常,直接使用file:///sdcard/ 或者 file:/sdcard也能夠
四坑:特殊字符的轉義
有一個頁面。iOS同事那邊一直顯示正常,Android這邊怎麽都出不來,相同頁面不同數據的頁面就顯示頁面。當時就認為非常奇怪,不應該是h5點問題。要不iOS也不會顯示,打印了URL一看,擦,URL中有一個”%”,轉義後便OK了。當然,依據須要另一些特殊字符也須要轉義。”%”僅僅是一個個例。
五坑:部分手機報錯不顯示
A WebView method was called on thread ‘JavaBridge’. All WebView methods must be called on the same thread。
這是因為部分手機WebView中方法必須在同一個線程。通過打印Thread.currentThread()便知不屬於同一個線程。解決方式:
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:" + data);
}
});
代碼還未從公司項目中剝離,眼下不上傳了,如有錯誤或者補充,多多不吝賜教。
Android混合開發,html5自己主動更新爬過的坑