javascript - 一個關(guān)于客戶端和前端通信的疑惑?
問題描述
客戶端使用WebViewClient類的shouldOverrideUrlLoading方法來處理前端和客戶端的通信。這種情況下,前端如何知道客戶端的處理回調(diào)?情況如下:
前端發(fā)送一個既定協(xié)議的地址,比如獲取當前的用戶jsbridge://bridge/userid
客戶端捕捉到這個加載然后開始執(zhí)行操作,比如往前端寫值javaScript:window.userId=12121
window.location.href = 'jsbridge://bridge/userid'console.log(window.userId) //這樣貌似拿不到userIdsetTimeout(function() { console.log(window.userId) //這樣就可以拿到了。}, 1000)
那這個種場景該怎么辦呢?
問題解答
回答1:我的理解,要想弄懂JSBridge,最終需要搞明白三件事,一個是H5如何調(diào)用Native,一個是Native如何調(diào)用H5,最后一個是兩者之間的回調(diào)。
H5如何調(diào)用Native,網(wǎng)上的的方法殊途同歸,就是在WebView加載H5頁面的時候會調(diào)用WebChromeClient或者是WebviewClient中的方法,選取其中的一個,來截取H5的數(shù)據(jù),交由Native處理
Native如何調(diào)用H5,歸根結(jié)底就是一條,webview.loadUrl(javascript:yourFunc(data););會把數(shù)據(jù)傳給H5并執(zhí)行H5中的yourFunc這個方法
兩者之間的回調(diào),即Native或者H5處理好對方的調(diào)用后,把結(jié)果返回給對方,供對方使用。本質(zhì)就是把調(diào)用函數(shù)Callback使用時間戳或者其他的唯一標識通過Map組織起來,即Map(UniqueID,Callback),并把此唯一標示UniqueID傳給對方函數(shù),對方執(zhí)行完畢后,會把這個唯一標示UniqueID和返回數(shù)據(jù)data傳回來,然后通過這個UniqueID找到調(diào)用函數(shù)CallBack,然后執(zhí)行CallBack(data)
從你的描述中可以知道,你現(xiàn)在是迷失在第二點上了,你需要在H5中寫一個JS方法:
function getUseID(userid){console.log(userid);}
Native中拿到數(shù)據(jù)后,執(zhí)行:
webview.loadUrl(javascript:getUseID(userid););
H5中的getUseID方法就會被喚起執(zhí)行了,數(shù)據(jù)也成功從Native中接收到
假如是一個完備的JSBridge,上面的第三點是一定要考慮到的。
你這個是Android Hybrid開發(fā),需要一個JSBridge給你一個輪子,大頭鬼寫的:https://github.com/JerryMissT...推薦幾個Blog,看了還是不錯的
http://www.cnblogs.com/dailc/...
http://blog.csdn.net/qq_23547...
http://zjutkz.net/2016/04/17/...
相關(guān)文章:
1. 在應(yīng)用配置文件 app.php 中找不到’route_check_cache’配置項2. html按鍵開關(guān)如何提交我想需要的值到數(shù)據(jù)庫3. HTML 5輸入框只能輸入漢字、字母、數(shù)字、標點符號?正則如何寫?4. javascript - 請教如何獲取百度貼吧新增的兩個加密參數(shù)5. Android中能不能判斷一個數(shù)據(jù)庫是create來的,還是open來的?6. gvim - 誰有vim里CSS的Indent文件, 能縮進@media里面的7. 跟著課件一模一樣的操作使用tp6,出現(xiàn)了錯誤8. PHP類屬性聲明?9. javascript - 求助canvas繪制馬賽克的問題,老是取色不準10. java - 安卓接入微信登錄,onCreate不會執(zhí)行
