今回は、 まず、 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 の分析
序文MySQL と Oracle のキーワードはまったく同じではありません。Oracle データベー...
効果画像(境界線の色が薄すぎるので、{} で囲みます): { }参考リンク Pure CSS バブル...
プロットレビュー前回の記事では、ロケーション命令の解析プロセスを分析しました。この内容を簡単に確認し...
JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...
目次序文フロントエンドモジュール開発の価値厄介な名前の競合面倒なファイル依存関係モジュール化の利点C...
1. リテラルとローカル変数へのアクセスは最も高速ですが、配列要素とオブジェクト メンバーへのアクセ...
目次導入:感情のインストール:一般的な CSS コンポーネントを追加します。既存のコンポーネントにス...
要素UIとはelement-ui は、Ele.me のフロントエンド チームが開発者、デザイナー、製...
実験環境ApacheとTomcatは両方ともIPアドレス192.168.153.136のホストにイン...
目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...
MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...
以前、純粋な CSS を使用して波の効果を実現する方法をいくつか紹介しました。それらについては、次の...
MySQLユーザー権限を表示する2つの方法を紹介します1. MySQL grantsコマンドを使用す...
rpmインストールパッケージを使用してmysqlをオフラインでインストールします。参考までに準備:公...
ユーザー組織には、ドメインに参加している 2 台の Windows Server 2008 R2 フ...