今回は、 まず、 mReactRootView.startReactApplication() を実行します。 getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions);
1. 以下に示すように、 最終的なReactContextInitParams initParams = 新しい ReactContextInitParams(jsExecutorFactory、jsBundleLoader); 2.
ReactContext を作成するまず、それがどこで呼ばれているかを見てみましょう: 最終的なReactApplicationContext reactApplicationContext = 作成Reactコンテキスト( initParams.getJsExecutorFactory().create()、 initParams.getJsBundleLoader()); 2 つの入力パラメータは、 JavaScriptエグゼキュータ
React Native の起動プロセスを振り返ると、作成プロセス中に実際に呼び出されるメソッドは次のとおりです。 ReactInstanceManager reactInstanceManager = builder.build() プライベート JavaScriptExecutorFactory getDefaultJSExecutorFactory( 文字列 appName、文字列 deviceName、コンテキスト applicationContext) { 試す { // JSCが含まれている場合は通常どおり使用します アプリケーションコンテキストが必要な場合は、SoLoader を初期化します。 SoLoader.loadLibrary("jscexecutor"); 新しい JSCExecutorFactory(appName, deviceName) を返します。 } キャッチ (UnsatisfiedLinkError jscE) { /* ... */ } } つまり、 @オーバーライド パブリックJavaScriptExecutor create()は例外をスローします{ WritableNativeMap jscConfig = 新しい WritableNativeMap(); jscConfig.putString("OwnerIdentity", "ReactNative"); jscConfig.putString("AppIdentity", mAppName); jscConfig.putString("デバイスID", mDeviceName); 新しい JSCExecutor(jscConfig) を返します。 } ストリップしない /* パッケージ */ クラス JSCExecutor は JavaScriptExecutor を拡張します { 静的{ SoLoader.loadLibrary("jscexecutor"); } /* パッケージ */ JSCExecutor(ReadableNativeMap jscConfig) { スーパー(initHybrid(jscConfig)); } @オーバーライド パブリック文字列getName() { 「JSCExecutor」を返します。 } プライベート静的ネイティブHybridData initHybrid(ReadableNativeMap jscConfig); } したがって、 Jsバンドルローダー同様に、 定義を見ると、 パブリック静的 JSBundleLoader アセットローダーを作成します ( 最終的なコンテキスト context、最終的な文字列 assetUrl、最終的なブール値 loadSynchronously) { 新しい JSBundleLoader() を返す { @オーバーライド パブリック文字列loadScript(JSBundleLoaderDelegateデリゲート) { delegate.loadScriptFromAssets(context.getAssets(), assetUrl, loadSynchronously); assetUrl を返します。 } }; }
ReactContext を作成するプライベートReactApplicationContext createReactContext( 最終的な ReactApplicationContext reactContext = new ReactApplicationContext(mApplicationContext); CatalystInstanceImpl.Builder catalystInstanceBuilder = /* ... */ 試す { catalystInstance を catalystInstanceBuilder.build() でビルドします。 } ついに { /* ... */ } reactContext.initializeWithInstance(catalystInstance); ターボモジュールマネージャー ターボモジュールマネージャー = 新しい TurboModuleManager( /* ... */ ) catalystInstance.setTurboModuleManager(turboModuleManager); mJSIModulePackage != null の場合 { catalystInstance.addJSIModules( /* ... */ ); } catalystInstance.runJSBundle(); reactContext を返します。 その中で、 インスタンスを初期化する
実行JSBundleパブリック void runJSBundle() { mJSBundleLoader.loadScript(CatalystInstanceImpl.this); 同期済み (mJSCallsPendingInitLock) { mAcceptCalls = true; (PendingJSCall 関数: mJSCallsPendingInit) { 関数を呼び出します(これを); } mJSCallsPendingInit.clear(); mJSBundleHasLoaded = true; } Systrace.registerListener(mTraceListener); } 前に返された パブリック文字列loadScript(JSBundleLoaderDelegateデリゲート) { delegate.loadScriptFromAssets(context.getAssets(), assetUrl, loadSynchronously); assetUrl を返します。 } パブリック void loadScriptFromAssets( AssetManager assetManager、文字列 assetURL、ブール値 loadSynchronously) { mSourceURL = アセットURL; jniLoadScriptFromAssets(assetManager、assetURL、同期的にロード)。 } ここでの セットアップReactコンテキストプライベートvoid setupReactContext(final ReactApplicationContext reactContext) { 同期された(mAttachedReactRoots){ 触媒インスタンスを初期化します。 (ReactRoot reactRoot : mAttachedReactRoots) の場合 { (reactRoot.getState().compareAndSet(ReactRoot.STATE_STOPPED、ReactRoot.STATE_STARTED)) の場合 { ルートビューをインスタンスにアタッチします(reactRoot); } } } UiThreadUtil.runOnUiThread() は、 パブリックボイド実行() { リスナーを初期化します。 } ) reactContext.runOnJSQueueThread() は、 パブリックボイド実行() { Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); } ) reactContext.runOnNativeModulesQueueThread() は、 パブリックボイド実行() { Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT); } ) } ここで何が起こっているか見てみましょう:
この記事の要約createReactContext メソッドと setupReactContext メソッドのソース コードから始めて、RN startReactApplication メソッドの実行プロセスが分析されます。これには次の内容が含まれます。 createReactContext の主な機能は、 setupReactContext の主な機能は、すべてのネイティブ モジュールを初期化し、すべてのルートビューを描画し、UI モジュール、JS モジュール、ネイティブ モジュール スレッドを作成し、優先順位を設定することです。 React Native startReactApplication メソッドに関するこの記事はこれで終わりです。React Native startReactApplication に関するその他の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Alibaba Cloud CentOS7 サーバーの nginx 構成と FAQ の分析
1. 同じIPアドレス、異なるポート番号仮想ホスト 1: ホスト IP アドレスは 172.16.3...
目次序文:詳しい紹介:練習する:要約する序文: Python、Java、Cシリーズなど、すべての主要...
序文2 つのテーブル内の同じフィールドの型が異なっていたり、エンコード タイプが異なっていたりするた...
この効果と同様に、方法も非常に簡単です。ヘッダーに次のように記述します: <link rel=...
1. less依存関係をインストールします: npm install less less-loade...
序文非表示要素の 3 つの属性である表示、可視性、不透明度の類似点と相違点は、フロントエンドの就職面...
目次1. ミックスイン.scss 2. 単一ファイルの使用3. グローバルマウント3.1 依存関係の...
Redisイメージをダウンロードする docker pull yyyyttttwww/redis を...
<br />当サイトのオリジナルコンテンツですので、転載の際は出典を123WORDPRE...
背景: 毎日少しずつ進歩し、少しずつ積み重ねていけば、どんどん良くなっていきますコード: <!...
Docker 公式ドキュメント: https://docs.docker.com/ Docker は...
1. 概要Promise オブジェクトは、ES6 で提案された非同期プログラミングの仕様です。非同期...
目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...
MySQL を使用して特定のステートメントを実行すると、データ量が多いためにデッドロックが発生し、...
目次導入インデックスの原則1. データページ2. ページディレクトリ3. インデックス原則分析要約す...