Slide 1

Slide 1 text

Ԛ്ReactNative for Android vashzhong(ᇘӑ)

Slide 2

Slide 2 text

૧ᄳലૼ • ߎી࿐߶React.js • React Nativeष൓ਔࢳી؟ࣲ • ࢃ֥҂ؓ౨਋ࢳ

Slide 3

Slide 3 text

ն۔ • React Native ൞೯ • React Native for Android ჰ৘ • ႋႨ

Slide 4

Slide 4 text

React Native൞೯ ၂ส8FC߄ ၍׮ႋႨषؿ۽ऎ ٚم

Slide 5

Slide 5 text

React Native൞೯? (View) var AwesomeProject = React.createClass({ render: function() { return ( {this.state.welcome_text} Text Content Click Me ); }, /* ... */ });

Slide 6

Slide 6 text

React Native൞೯ (style) var styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });

Slide 7

Slide 7 text

React Native൞೯ (logic) var AwesomeProject = React.createClass({ /* ... */ getInitialState: function() { return {welcome_text: "Welcome to React Native!"}; }, handleClick: function() { this.setState({welcome_text: 'Hello World'}) } });

Slide 8

Slide 8 text

React Native൞೯ (app)

Slide 9

Slide 9 text

Ⴊಌׄ c  ൡކ8FCषؿ c  ၂สٚم؟۱௜෻ c  б)UNMٚσྟିݺ c  ׮෿หྟ c  GBDFCPPL႕ཙ৯ c  ҂Ӯඃ ቆࡱປӮ֮ bug؟  c  ྟି҂ۚ c  ௜෻࡙ಸ

Slide 10

Slide 10 text

React Native for Android ჰ৘

Slide 11

Slide 11 text

React Native for Android ჰ৘ ࣸ௞ልྍࣵ࢖Ч <-> JNI C++ binding <-> Java

Slide 12

Slide 12 text

React Native for Android ჰ৘ ReactBridge(java/jni) (1) package com.facebook.react.bridge; ... public class ReactBridge extends Countable { /* package */ static final String REACT_NATIVE_LIB = "reactnativejni"; static { SoLoader.loadLibrary(REACT_NATIVE_LIB); } private final ReactCallback mCallback; private final JavaScriptExecutor mJSExecutor; private final MessageQueueThread mNativeModulesQueueThread; c js๙ݖmCallbackᄝmNativeModulesQueueThreadטႨNative c native๙ݖmJSExecutorטႨjs

Slide 13

Slide 13 text

React Native for Android ჰ৘ ReactBridge(java/jni) (2) package com.facebook.react.bridge; ... public class ReactBridge extends Countable { ... public ReactBridge( JavaScriptExecutor jsExecutor, ReactCallback callback, MessageQueueThread nativeModulesQueueThread) { mJSExecutor = jsExecutor; mCallback = callback; mNativeModulesQueueThread = nativeModulesQueueThread; initialize(jsExecutor, callback, mNativeModulesQueueThread); } c initializeູnativeٚم ؓႋC++֥bridge::createٚم

Slide 14

Slide 14 text

React Native for Android ჰ৘ ReactBridge(java/jni) (3) c initializeູnativeٚم ؓႋC++֥bridge::createٚم registerNatives("com/facebook/react/bridge/ReactBridge", { makeNativeMethod("initialize", "(Lcom/facebook/react/bridge/JavaScriptExecutor;Lcom/facebook/react/ bridge/ReactCallback;Lcom/facebook/react/bridge/queue/ MessageQueueThread;)V", bridge::create), makeNativeMethod( "loadScriptFromAssets", "(Landroid/content/res/ AssetManager;Ljava/lang/String;)V", bridge::loadScriptFromAssets), ... }); src/main/jni/react/jni/OnLoad.cpp

Slide 15

Slide 15 text

React Native for Android ჰ৘ (c++) static void create(JNIEnv* env, jobject obj, jobject executor, jobject callback, jobject callbackQueueThread) { auto weakCallback = createNew(callback); auto weakCallbackQueueThread = createNew(callbackQueueThread); auto bridgeCallback = [weakCallback, weakCallbackQueueThread] (std::vector calls, bool isEndOfBatch) { dispatchCallbacksToJava(weakCallback, weakCallbackQueueThread, std::move(calls), isEndOfBatch); }; auto nativeExecutorFactory = extractRefPtr(env, executor); auto bridge = createNew(nativeExecutorFactory, bridgeCallback); setCountableForJava(env, obj, std::move(bridge)); } c ᇿၩᆃ৚֥bridgeCallback, c++11֥lambdaეم

Slide 16

Slide 16 text

React Native for Android ჰ৘ (c++) static void create(JNIEnv* env, jobject obj, jobject executor, jobject callback, jobject callbackQueueThread) { auto weakCallback = createNew(callback); auto weakCallbackQueueThread = createNew(callbackQueueThread); auto bridgeCallback = [weakCallback, weakCallbackQueueThread] (std::vector calls, bool isEndOfBatch) { dispatchCallbacksToJava(weakCallback, weakCallbackQueueThread, std::move(calls), isEndOfBatch); }; auto nativeExecutorFactory = extractRefPtr(env, executor); auto bridge = createNew(nativeExecutorFactory, bridgeCallback); setCountableForJava(env, obj, std::move(bridge)); } c ᇿၩᆃ৚֥bridgeCallback, c++11֥lambdaეم

Slide 17

Slide 17 text

React Native for Android ჰ৘ Native ——> Js

Slide 18

Slide 18 text

React Native for Android ჰ৘ Native ——> Js

Slide 19

Slide 19 text

React Native for Android ჰ৘ js —> native dispatchCallbacksToJava

Slide 20

Slide 20 text

React Native for Android ჰ৘ js —> native

Slide 21

Slide 21 text

React Native for Android ჰ৘ bridgeФජԷࡹ CatalystInstance package com.facebook.react.bridge; ... public class CatalystInstanceImpl implements CatalystInstance { ... // Access from any thread private final CatalystQueueConfigurationImpl mCatalystQueueConfiguration; private final JavaScriptModuleRegistry mJSModuleRegistry; private final NativeModuleRegistry mJavaRegistry; ... // Access from JS thread private @Nullable ReactBridge mBridge; private CatalystInstanceImpl(...) { ... mCatalystQueueConfiguration.getJSQueueThread().runOnQueue(()->{ initializeBridge(jsExecutor, jsModulesConfig);} } private void initializeBridge() { mBridge = new ReactBridge(…) }

Slide 22

Slide 22 text

React Native for Android ჰ৘ bridgeФජԷࡹ CatalystInstance

Slide 23

Slide 23 text

React Native for Android ჰ৘ ቋᇔReactContext package com.facebook.react.bridge; ... public class ReactContext extends ContextWrapper { ... private @Nullable CatalystInstance mCatalystInstance; private @Nullable LayoutInflater mInflater; private @Nullable MessageQueueThread mUiMessageQueueThread; private @Nullable MessageQueueThread mNativeModulesMessageQueueThread; private @Nullable MessageQueueThread mJSMessageQueueThread; private @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; private @Nullable Activity mCurrentActivity;

Slide 24

Slide 24 text

React Native for Android ჰ৘ ቋᇔReactContext package com.facebook.react.bridge; ... public class ReactContext extends ContextWrapper { ... private @Nullable CatalystInstance mCatalystInstance; private @Nullable LayoutInflater mInflater; private @Nullable MessageQueueThread mUiMessageQueueThread; private @Nullable MessageQueueThread mNativeModulesMessageQueueThread; private @Nullable MessageQueueThread mJSMessageQueueThread; private @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; private @Nullable Activity mCurrentActivity;

Slide 25

Slide 25 text

React Native for Android ჰ৘ ቋᇔReactContext

Slide 26

Slide 26 text

React Native for Android ჰ৘ ൕၩ๭ https://speakerdeck.com/frantic/react-native-under-the-hood

Slide 27

Slide 27 text

React Native for Android ႋႨ

Slide 28

Slide 28 text

我编不下去了...

Slide 29

Slide 29 text

DEMO

Slide 30

Slide 30 text

ሹࢲ • React Native还太新了, 业余可以玩玩, 多了解它的 理念, ⽤用在⽣生产环境还需时间. • React Native本质仍是提升开发效率, 节约开发时间 • 可以因为React Native的原因申请mac⼀一体机 :)