In diesem Artikel haben wir den Startvorgang von Sehen wir uns zunächst an, wo mReactRootView.startReactApplication( getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions); Sie können sehen, dass Folgen Sie
1. Erstellen Sie eine endgültige ReactContextInitParams initParams = neue ReactContextInitParams(jsExecutorFactory, jsBundleLoader); 2. Rufen Sie
ReactContext erstellenSchauen Sie sich zunächst an, wo es heißt: endgültiger ReactApplicationContext reactApplicationContext = erstelleReactContext( initParams.getJsExecutorFactory().create(), initParams.getJsBundleLoader()); Seine beiden Eingabeparameter sind JavaScriptExecutor Der erste Eingabeparameter Wenn wir auf den Startvorgang von React Native zurückblicken, wird während des Erstellungsprozesses tatsächlich die folgende Methode aufgerufen: ReactInstanceManager reactInstanceManager = builder.build() private JavaScriptExecutorFactory getDefaultJSExecutorFactory( String Anwendungsname, String Gerätename, Kontext Anwendungskontext) { versuchen { // Wenn JSC enthalten ist, verwenden Sie es wie gewohnt initializeSoLoaderIfNecessary(Anwendungskontext); SoLoader.loadLibrary("jscexecutor"); gibt neue JSCExecutorFactory (Anwendungsname, Gerätename) zurück; } Fang (UnsatisfiedLinkError jscE) { /* ... */ } } Das heißt, wenn wir @Überschreiben öffentliches JavaScriptExecutor create() wirft Exception { WritableNativeMap jscConfig = neue WritableNativeMap(); jscConfig.putString("OwnerIdentity", "ReactNative"); jscConfig.putString("AppIdentity", mAppName); jscConfig.putString("Geräteidentität", mGerätename); gibt neuen JSCExecutor(jscConfig) zurück; } Ein Blick auf die Definition von @DoNotStrip /* Paket */ Klasse JSCExecutor erweitert JavaScriptExecutor { statisch { SoLoader.loadLibrary("jscexecutor"); } /* Paket */ JSCExecutor(ReadableNativeMap jscConfig) { super(initHybrid(jscConfig)); } @Überschreiben öffentliche Zeichenfolge getName() { gibt "JSCExecutor" zurück; } private statische native HybridData initHybrid(ReadableNativeMap jscConfig); } Es ist also klar, dass der erste Parameter von JsBundleLoader Ebenso lautet im Bei der Definition habe ich festgestellt, dass es eine öffentlicher statischer JSBundleLoader createAssetLoader( finaler Kontext Kontext, finaler String AssetUrl, finaler Boolean LoadSynchronously) { returniere neuen JSBundleLoader() { @Überschreiben öffentliche Zeichenfolge loadScript(JSBundleLoaderDelegate-Delegierter) { delegate.loadScriptFromAssets(context.getAssets(), assetUrl, synchron laden); AssetUrl zurückgeben; } }; } Nachdem wir die ReactContext erstellenprivater ReactApplicationContext erstelleReactContext( endgültiger ReactApplicationContext reactContext = neuer ReactApplicationContext(mApplicationContext); CatalystInstanceImpl.Builder catalystInstanceBuilder = /* ... */ versuchen { catalystInstance = catalystInstanceBuilder.build(); } Endlich { /* ... */ } reactContext.initializeWithInstance(Katalysatorinstanz); TurboModuleManager turboModuleManager = neuer TurboModuleManager( /* ... */ ) catalystInstance.setTurboModuleManager(turboModuleManager); if (mJSIModulePackage != null) { catalystInstance.addJSIModules( /* ... */ ); } catalystInstance.runJSBundle(); reactContext zurückgeben; Darin wird zuerst initialisierenMitInstanz Durch den Aufruf Führen Sie JSBundle aus.öffentliche Leere runJSBundle() { mJSBundleLoader.loadScript(CatalystInstanceImpl.this); synchronisiert (mJSCallsPendingInitLock) { mAcceptCalls = wahr; für (PendingJSCall-Funktion: mJSCallsPendingInit) { Funktion.Aufruf(dies); } mJSCallsPendingInit.clear(); mJSBundleHasLoaded = wahr; } Systrace.registerListener(mTraceListener); } Führen Sie die öffentliche Zeichenfolge loadScript(JSBundleLoaderDelegate-Delegierter) { delegate.loadScriptFromAssets(context.getAssets(), assetUrl, synchron laden); AssetUrl zurückgeben; } öffentliche void loadScriptFromAssets( AssetManager assetManager, String assetURL, boolean synchron laden) { mSourceURL = Asset-URL; jniLoadScriptFromAssets(assetManager, assetURL, synchron laden); } Die Methode ReactContext einrichtenprivate void setupReactContext(finaler ReactApplicationContext reactContext) { synchronisiert (mAttachedReactRoots) { catalystInstance.initialize(); für (ReactRoot reactRoot : mAttachedReactRoots) { wenn (reactRoot.getState().compareAndSet(ReactRoot.STATE_STOPPED, ReactRoot.STATE_STARTED)) { Fügt RootViewToInstance hinzu (reactRoot); } } } UiThreadUtil.runOnUiThread( öffentliche Leere ausführen() { listener.onReactContextInitialisiert(reactContext); } ) reactContext.runOnJSQueueThread( öffentliche Leere ausführen() { Prozess.setThreadPriority(Prozess.THREAD_PRIORITY_DEFAULT); } ) reactContext.runOnNativeModulesQueueThread( öffentliche Leere ausführen() { Prozess.setThreadPriority(Prozess.THREAD_PRIORITY_DEFAULT); } ) } Folgendes passiert hier:
Zusammenfassung dieses ArtikelsAusgehend vom Quellcode der Methoden createReactContext und setupReactContext wird der Ausführungsprozess der RN-Methode startReactApplication analysiert, einschließlich: Die Hauptfunktion von createReactContext besteht darin, Die Hauptfunktion von setupReactContext besteht darin, alle nativen Module zu initialisieren, alle Rootviews zu zeichnen, UI-Modul-, JS-Modul- und native Modul-Threads zu erstellen und Prioritäten festzulegen. Dies ist das Ende dieses Artikels über die React Native startReactApplication-Methode. Weitere verwandte Inhalte zu React Native startReactApplication finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Analyse der Nginx-Konfiguration und häufig gestellter Fragen des Alibaba Cloud CentOS7-Servers
>>: Zusammenfassung der grundlegenden Kenntnisse zur MySql-Datenbank
Inhaltsverzeichnis splice() Methode join() Method...
Vorwort Im aktuellen JavaScript gibt es kein Konz...
Docker erfreut sich seit zwei Jahren großer Belie...
Schauen wir uns zunächst den GIF-Vorgang an: Fall...
Dieser Artikel erläutert anhand von Beispielen di...
In einem Projekt müssen Sie häufig Umgebungsvaria...
Verwenden Sie runlike, um die Docker Run-Startpar...
RGB-Farbtabelle Farbe Englischer Name RGB 16 Farb...
Die Konfiguration ist sehr einfach, aber ich muss...
Hinweis: Die dritte Methode wird nur in XSell ver...
Front-End-Projektpaketierung Suchen Sie .env.prod...
1. Laden Sie die beschleunigte Version von msyql ...
Szenario Sie müssen das Xshell-Tool verwenden, um...
Inhaltsverzeichnis Regelmäßig beschneiden Spiegel...
Dieser Artikel veranschaulicht anhand von Beispie...