今回は、 まず、 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 の分析
面接には必需品、仕事でも必ず使います。うーん、誰でも分かるでしょう。これ以上何も言わずに、要約とレン...
目次クラスコンポーネントイベントバインディング関数コンポーネントイベントバインディング要約するRea...
DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...
1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...
MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...
Ubuntu 1804 への MySQL 5.7 のインストールについて詳しく紹介します。 MySQ...
最近私の記事を読んだ人なら誰でも、私が現在WeChatミニプログラムプロジェクトを担当しており、その...
1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...
<br />友人と話し合っていたとき、フレームワークのレイヤー設計の中で最も核となるのは...
nginx でファイルサーバーを構築することもありますが、これは一般に公開されていますが、サーバーが...
以下のように表示されます。 SELECT prod_name,prod_price FROM pro...
1. インデックスの原則インデックスは、列内の特定の値を持つ行をすばやく見つけるために使用されます。...
awk を学ぶ前に、sed、grep、tr、cut などのコマンドを学んでおく必要があります。これら...
シェル スクリプトで電子メールを作成する必要がある場合は、コマンド ラインから電子メールを送信する知...
Ubuntu 16.04 FTP サーバーをビルドするftpをインストールするftp をインストール...