今回は、 まず、 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. Dockerネットワークカードを作成する [root@i ~]# brctl addbr d...
この記事では、Docker を使用して Centos6 に Zookeeper をデプロイする方法に...
JDBC の 6 つのステップ: 1. ドライバーを登録する2. データベース接続を取得する3. デ...
最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...
サーバーも 2 つあります。準備:コンテナのホスト名を設定する consul: kv タイプのストレ...
最近、プロジェクトの過程で問題に遭遇しました。メニューバーを常に上部に表示し、後続の要素をその下に表...
多くのウェブサイトを閲覧すると、ブラウザのアドレスバーの前に小さなアイコンがあり、ブラウザのタブの位...
目次1. 事務:取引の 4 つの主な特徴:同時トランザクションはどのような問題を引き起こしますか? ...
この間、プロジェクトに取り組んでいるときに、データ間の接続が非常に複雑なモジュールに遭遇しました。テ...
CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...
効果は以下のとおりです。参考プログラム: <!DOCTYPE html> <htm...
1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...
半透明の境界線結果: 実装コード: <div> 半透明の境界線が見えますか? </...
この記事では、アバター変更機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...
Raspberry Pi は ARM アーキテクチャをベースとしているため、Docker のインスト...