内容简介:开篇之前日常安利上一篇提到了UI容器类ReactRootView,这一次继续我们的分析之路
转载请注明出处:王亟亟的大牛之路
开篇之前日常安利
https://github.com/ddwhan0123/Useful-Open-Source-Android (各种库的收纳,长期维护)
上一篇提到了UI容器类ReactRootView,这一次继续我们的分析之路
写着一片之前,没有看过任何其他兄弟对相关内容的分析,不是觉得自己牛逼。
是怕别人的思维影响到我的理解,如果讲得不对,欢迎指出!
上一篇的传送门 React Native安卓实现分析之ReactRootView的实现过程
ReactNativeHost
ReactNativeHost应该是我们在学习RN项目之初最初接触到的几个类之一,他在初始化项目Application的时候被用到,常用的方法有 getUseDeveloperSupport() getPackages() getJSBundleFile() 等,既然是一个常用的类我们就看下他的实现
他是一个抽象类,也就实现的方法。
在我们业务的Application里做的各种赋值的操作,都是为了给ReactApplication的getReactNativeHost()方法使用
继而在创建RNActivity的onCreate() 方法的时候创建/获取ReactNativeHost中ReactInstanceManager的实例,以下为刚才提到的一些业务场景
public abstract class ReactNativeHost {...}
业务Application只要实现ReactApplication就会调用的方法
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
RNActivity的onCreate() 中创建ReactInstanceManager实例
((RNApp) getApplication()).getReactNativeHost().getReactInstanceManager();
getJSBundleFile()
在ReactNativeHost的getJSBundleFile()我们返回包中bundler的地址,通常是放在默认值或者自己放的一个拓展地址里,或者使用CodePush,像这样
自定义地址场景
@Override
protected @Nullable String getJSBundleFile() {
String jsBundleFile = getFilesDir().getAbsolutePath() + "/index.android.bundle";
File file = new File(jsBundleFile);
return file != null && file.exists() ? jsBundleFile : null;
}
使用CodePush的场景
实质为 assets://index.android.bundle 的地址
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
getUseDeveloperSupport()
返回一个boolean类型的结果,如果为true,支持reload Js
getPackages()
它是一个 List<ReactPackage> 类型的容器,我们项目用到的所有Package都回家在里面,如FB提供的 MainReactPackage 和我们用到的CodePush的和一些自定义组件的Package
public class MainReactPackage extends LazyReactPackage {...}
public class CodePush implements ReactPackage {...}
public class RCTToastPackage implements ReactPackage {...}
最终他会在我们创建 ReactInstanceManager 时进行装箱
//...省略内容
for (ReactPackage reactPackage : getPackages()) {
builder.addPackage(reactPackage);
}
createReactInstanceManager()
protected ReactInstanceManager createReactInstanceManager() {
ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()
.setApplication(mApplication)//设置关联的Application对象
.setJSMainModulePath(getJSMainModuleName()) //设置主MoudleName 其实就是index.android
.setUseDeveloperSupport(getUseDeveloperSupport())//设置是否debug
.setRedBoxHandler(getRedBoxHandler())//红盒的回调
.setJavaScriptExecutorFactory(getJavaScriptExecutorFactory())//js执行的工厂类
.setUIImplementationProvider(getUIImplementationProvider())//官方建议不使用自定义的UI实现
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE);//设置创建时机
for (ReactPackage reactPackage : getPackages()) {
builder.addPackage(reactPackage);
}
String jsBundleFile = getJSBundleFile();
if (jsBundleFile != null) {
builder.setJSBundleFile(jsBundleFile);
} else {
builder.setBundleAssetName(Assertions.assertNotNull(getBundleAssetName()));
}
return builder.build();
}
它构建了一个基础的 ReactInstanceManager
ReactInstanceManager是总的管理类,管理ReactPackage,管理ReactRootView,控制生命周期。
总结:
这一篇篇幅比较短,介绍了ReactNativeHost 这个抽象类
它主要的功能是为内部创建的ReactInstanceManager获取必要的业务属性,ReactInstanceManager创建后才是 真正RN应用的启动
插一段广告
蔚来汽车
上海 安亭/徐家汇/漕河泾 (安亭有班车)
收Android/iOS/.Net/Java/Vue/RN开发
标准五险一金(不避税)
不强制加班,弹性工作
有意向的可以加我微信,必须注明来意
以上所述就是小编给大家介绍的《React Native安卓实现分析之ReactInstanceManager的包装类ReactNativeHost》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JavaSE基础:包装类
- 一分钟理解 Java 包装类型
- 包装常见的python命名空间
- css – 浮动流体图像留下文本包装
- 14.java 基本数据类型的包装类
- 前端开发如何包装可重用的JavaScript代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计数组合学(卷2)
斯坦利 / 机械工业出版社 / 2004-11-15 / 59.00元
本书介绍了生成函数组合、树、代数生成函数、D有限生成函数、非交换生成函数和对称函数。关于对称函数的论述只适用于研究生的入门课程并着重于组合学方面,尤其是Robinson-Schensted-Knuth算法,还讨论了对称函数与表示论之间的联系。附录(由Sergey Fomin编写)中更深入地讨论了对称函数理论,包括jeu de taquin和Littlewood-richardson规则。另外,书中......一起来看看 《计数组合学(卷2)》 这本书的介绍吧!