JSBridge理解:
兩個容器:
- native端記錄一個messageHandlers韧涨,鍵值對為方法名和接口回調(diào)引矩,用于注冊方法惠况;
- native端記錄一個responseCallbacks琐谤,鍵值對為發(fā)送id和接口回調(diào)进苍,用于發(fā)送方法贯城;
注冊發(fā)送流程:
- 當發(fā)送時熊楼,通過loadUrl把指定方法按照指定格式發(fā)到h5,同時記錄id和接口回調(diào)能犯;
- h5響應(yīng)后鲫骗,調(diào)用對應(yīng)方法;開始構(gòu)造返回結(jié)果消息踩晶,將消息放到隊列中执泰;
- h5變更frame.src來觸發(fā)native的shouldOverrideUrlLoading,在這里記錄下fetchQueue方法名和對應(yīng)的接口回調(diào)渡蜻;
- native再次loadUrl方法fetchQueue术吝,在h5中把消息隊列扁平化json,然后清空茸苇,把json再次通過frame.src來發(fā)送到native排苍;
- 將扁平化的json轉(zhuǎn)化為消息列表,然后再根據(jù)響應(yīng)id來找對應(yīng)的方法学密;
- 存在響應(yīng)id則是在發(fā)送方法容器中根據(jù)id找到接口回調(diào)淘衙,執(zhí)行后移除;
- 不存在響應(yīng)id则果,則是在注冊消息容器中查找幔翰,找到后執(zhí)行接口方法,需要回應(yīng)的則再次走發(fā)送方法西壮。
為什么frame.src要變更兩次遗增,多走一次從js到native再到j(luò)s再到native才返回數(shù)據(jù),這中間涉及到的fetchQueue的目的是干什么的款青?
如果是一個方法就是一次回調(diào)做修,可能會通信頻率超級高;所以通過消息隊列的方式抡草,這么來回走一次的間隔饰及,然后把中間積累的消息統(tǒng)一發(fā)出去,這樣通過減少發(fā)生次數(shù)來降低通信頻率康震。
參考:
NATIVE JSBRIDGE源碼解析 深入理解JSBRIDGE
android js交互_混合開發(fā)之JavaScriptInterfaceAndroid端交互