JSBridge理解:
两个容器:
- native端记录一个messageHandlers,键值对为方法名和接口回调,用于注册方法;
- native端记录一个responseCallbacks,键值对为发送id和接口回调,用于发送方法;
注册发送流程:
- 当发送时,通过loadUrl把指定方法按照指定格式发到h5,同时记录id和接口回调;
- h5响应后,调用对应方法;开始构造返回结果消息,将消息放到队列中;
- h5变更frame.src来触发native的shouldOverrideUrlLoading,在这里记录下fetchQueue方法名和对应的接口回调;
- native再次loadUrl方法fetchQueue,在h5中把消息队列扁平化json,然后清空,把json再次通过frame.src来发送到native;
- 将扁平化的json转化为消息列表,然后再根据响应id来找对应的方法;
- 存在响应id则是在发送方法容器中根据id找到接口回调,执行后移除;
- 不存在响应id,则是在注册消息容器中查找,找到后执行接口方法,需要回应的则再次走发送方法。
为什么frame.src要变更两次,多走一次从js到native再到js再到native才返回数据,这中间涉及到的fetchQueue的目的是干什么的?
如果是一个方法就是一次回调,可能会通信频率超级高;所以通过消息队列的方式,这么来回走一次的间隔,然后把中间积累的消息统一发出去,这样通过减少发生次数来降低通信频率。
参考:
NATIVE JSBRIDGE源码解析 深入理解JSBRIDGE
android js交互_混合开发之JavaScriptInterfaceAndroid端交互