native-JavaScript通信流程( 基于最新的 react native版本 )

JavaScriptModule是用来实现java端对JavaScript端的调用,java端的JavaScriptModule只是抽象,用来找到JavaScript端对应的JavaScriptModule真正实现类函数的具体实现功能。两端类名与函数一一对应映射,很类似键值对的概念。实现Native接口到Javascript中同名模块的映射,Native 接口中所有的公用方法也将一一映射到同名的 Javascript 模块中的方法,调用Native接口的方法相当于直接调用到222同名 Javascript 模块中的方法,另外JavaScript不支持重载。文档主要介绍使用,调用和信息传递的过程。

一个很好的React Native整体介绍:https://zhuanlan.zhihu.com/p/86836826?utm_source=wechat_session
一.创建并调用一个JavaScriptModule组件

1.首先java端新增一个接口,继承自JavaScriptModule 接口。网上大部分介绍的createJSModules后续方法在React Native 0.47版本中已经被移除了。
package com.facebook.react.modules.appregistry;
import com.facebook.react.bridge.JavaScriptModule;

/** zhangys Demo. */
public interface DemoModule extends JavaScriptModule {

void Demofun(String strDemo);
}
调用JavaScriptModuleRegistry的getJavaScriptModule函数时创建对应的JavaScriptModule并保存在JavaScriptModuleRegistry的mModuleInstances容器。

2.JavaScript端创建并注册同名的JavaScriptModule和实现类。
BatchedBridge.registerCallableModule('DemoModule ', DemoModule );
Demofun(strDemo: string): void {
if (strDemo !== ‘demo’) {
const msg = ‘Running "’ + strDemo;
infoLog(msg);
);
}

BatchedBridge.registerCallableModule会调用到MessageQueue.js中的同名函数,以类名和对象的映射格式放入_lazyCallableModules中。
registerCallableModule(name: string, module: Object) {
this._lazyCallableModules[name] = () => module;
}

3.native端调用这个函数
mCatalystInstance.getJSModule(DemoModule.class).Demofun(“DEMO”);

二.调用JavaScriptModule函数的过程

1.获取JavaScriptModule:
getReactContext().getJSModule(SubviewsClippingTestModule.class);
mCatalystInstance.getJSModule(TestJSToJavaParametersModule.class);
两种方式内部都是调用CatalystInstanceImpl。(.class是java中的类对象,其中保存了创建对象所需的所有信息。)

2.JavaScriptModuleRegistry用来保存java端的JavaScriptModule
private final HashMap<Class<? extends JavaScriptModule>, JavaScriptModule> mModuleInstances;

3.如果当前mModuleInstances容器中沒有,通过JavaScriptModule
InvocationHandler创建动态代理类,并放入到容器中
JavaScriptModule interfaceProxy =
(JavaScriptModule)
Proxy.newProxyInstance(
moduleInterface.getClassLoader(),
new Class[] {moduleInterface},
new JavaScriptModuleInvocationHandler(instance, moduleInterface));
mModuleInstances.put(moduleInterface, interfaceProxy);
参数分别是:当前对象使用的类加载器,方法是固定的;对象实现的接口的类型;执行JavaScriptModule对象的方法时,会被JavaScriptModuleRegistry中的这个代理类JavaScriptModuleInvocationHandler的invoke方法拦截,把当前执行对象的方法和参数传入。

4.拦截全部对JavaScriptModule的方法调用
public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值