整体架构
整体架构
分为三部分,js层,native层,以及两层互相通讯的bridge
UI更新
使用了虚拟dom的概念,结合diff算法,将在js侧对组件的更改批量,异步地发送到nativ侧,同时最小化了需要通过bridge传递的数据量,因此,RN中的ui更新是异步完成的。
当js侧的更新指令被批量,异步地发送到native侧,在native执行实际的更新操作时,js线程不会被阻塞,所以,当我们如果更改了一个按钮的颜色,然后马上获取该按钮的颜色,可能会出现获取不到最新的颜色,因为native侧的更新操作可能还没有完成
RN中的线程
在 ReactQueueConfigurationImpl.java中定义并创建了三个线程
public class ReactQueueConfigurationImpl implements ReactQueueConfiguration {
private final MessageQueueThreadImpl mUIQueueThread; // ui线程
private final MessageQueueThreadImpl mNativeModulesQueueThread; // native modules线程
private final MessageQueueThreadImpl mJSQueueThread; // js线程
private ReactQueueConfigurationImpl(
MessageQueueThreadImpl uiQueueThread,
MessageQueueThreadImpl nativeModulesQueueThread,
MessageQueueThreadImpl jsQueueThread) {
mUIQueueThread = uiQueueThread;
mNativeModulesQueueThread = nativeModulesQueueThread;
mJSQueueThread = jsQueueThread;
}
@Override
public MessageQueueThread getUIQueueThread() {
return mUIQueueThread;
}
@Override
public MessageQueueThread getNativeModulesQueueThread() {
return mNativeModulesQueueThread;
}
@Override
public MessageQueueThread getJSQueueThread() {
return mJSQueueThread;
}
public void destroy() {
if (mNativeModulesQueueThread.getLooper() != Looper.getMainLooper()) {
mNativeModulesQueueThread.quitSynchronous();
}
if (mJSQueueThread.getLooper() != Looper.getMainLooper()) {
mJSQueueThread.quitSynchronous();
}
}
// 创建线程
public static ReactQueueConfigurationImpl create(
ReactQueueConfigurationSpec spec, QueueThreadExceptionHandler exceptionHandler) {
Map<MessageQueueThreadSpec, MessageQueueThreadImpl> specsToThreads = MapBuilder.newHashMap();
MessageQueueThreadSpec uiThreadSpec = MessageQueueThreadSpec.mainThreadSpec();
MessageQueueThreadImpl uiThread = MessageQueueThreadImpl.create(uiThreadSpec, exceptionHandler);
specsToThreads.put(uiThreadSpec, uiThread);
MessageQueueThreadImpl jsThread = specsToThreads.get(spec.getJSQueueThreadSpec());
if (jsThread == null) {
jsThread = MessageQueueThreadImpl.create(spec.getJSQueueThreadSpec(), exceptionHandler);
}
MessageQueueThreadImpl nativeModulesThread =
specsToThreads.get(spec.getNativeModulesQueueThreadSpec());
if (nativeModulesThread == null) {
nativeModulesThread =
MessageQueueThreadImpl.create(spec.getNativeModulesQueueThreadSpec(), exceptionHandler);
}
return new ReactQueueConfigurationImpl(uiThread, nativeModulesThread, jsThread);
}
}