今回は、 まず、 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 の分析
目次序文: Ubuntu 18.04 は apt ソースを Alibaba Cloud ソースに変更...
通常、ユーザーがアップロードした写真はデータベースに保存する必要があります。一般的に、解決策は 2 ...
目次Linux ドライバーの共通機能 (copy_from_user open read write...
概要(公式にはより詳しい説明があります) Firewalld は、ネットワーク接続またはインターフェ...
この記事では、従業員管理登録ページを実装するためのjQueryの具体的なコードを例として紹介します。...
目次1. 現在のデータベース支出のストレージエンジンを表示する方法1:方法2: 2. ENGINE=...
最近、Oracle、MySQL、SQL Server 2005 のデータ ページング クエリについて...
クロージャは、純粋関数型プログラミング言語の伝統的な機能の 1 つです。クロージャをコア言語構造の不...
これまで react.forwardRef は react の高階コンポーネントには適用できませんで...
前提条件Compose は、Docker コンテナをオーケストレーションするためのツールです。Doc...
テーブルが広い場合は、あふれてしまう可能性があります。たとえば、左と右の 2 つの div がありま...
フロントエンドがインターフェースを要求すると、バックエンドでインターフェースが定義されます。ステータ...
この記事では、JavaScript Canvasの動的なワイヤーフレーム効果を描画する具体的なコード...
この記事では、参考までに、加算計算機を実装するためのJavaScriptの具体的なコードを紹介します...