private async Task InitializeReactContextAsync( Func<IJavaScriptExecutor> jsExecutorFactory, JavaScriptBundleLoader jsBundleLoader) { var currentReactContext = _currentReactContext; if (currentReactContext != null) { await TearDownReactContextAsync(currentReactContext); _currentReactContext = null; } try { var reactContext = await CreateReactContextAsync(jsExecutorFactory, jsBundleLoader); SetupReactContext(reactContext); } catch (Exception ex) { _devSupportManager.HandleException(ex); } finally { _contextInitializationTask = null; } if (_pendingJsExecutorFactory != null) { var pendingJsExecutorFactory = _pendingJsExecutorFactory; var pendingJsBundleLoader = _pendingJsBundleLoader; _pendingJsExecutorFactory = null; _pendingJsBundleLoader = null; RecreateReactContextInBackground( pendingJsExecutorFactory, pendingJsBundleLoader); } }
private async Task<ReactContext> CreateReactContextAsync( Func<IJavaScriptExecutor> jsExecutorFactory, JavaScriptBundleLoader jsBundleLoader) { Tracer.Write(ReactConstants.Tag, "Creating React context."); _sourceUrl = jsBundleLoader.SourceUrl; var nativeRegistryBuilder = new NativeModuleRegistry.Builder(); var jsModulesBuilder = new JavaScriptModuleRegistry.Builder(); var reactContext = new ReactContext(); if (_useDeveloperSupport) { reactContext.NativeModuleCallExceptionHandler = _devSupportManager.HandleException; } using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCoreModulesPackage").Start()) { var coreModulesPackage = new CoreModulesPackage(this, InvokeDefaultOnBackPressed, _uiImplementationProvider); ProcessPackage(coreModulesPackage, reactContext, nativeRegistryBuilder, jsModulesBuilder); } foreach (var reactPackage in _packages) { using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCustomReactPackage").Start()) { ProcessPackage(reactPackage, reactContext, nativeRegistryBuilder, jsModulesBuilder); } } var nativeModuleRegistry = default(NativeModuleRegistry); using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "buildNativeModuleRegistry").Start()) { nativeModuleRegistry = nativeRegistryBuilder.Build(); } var exceptionHandler = _nativeModuleCallExceptionHandler ?? _devSupportManager.HandleException; var reactInstanceBuilder = new ReactInstance.Builder { QueueConfigurationSpec = ReactQueueConfigurationSpec.Default, JavaScriptExecutorFactory = jsExecutorFactory, Registry = nativeModuleRegistry, JavaScriptModuleRegistry = jsModulesBuilder.Build(), BundleLoader = jsBundleLoader, NativeModuleCallExceptionHandler = exceptionHandler, }; var reactInstance = default(ReactInstance); using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createReactInstance").Start()) { reactInstance = reactInstanceBuilder.Build(); } // TODO: add bridge idle debug listener reactContext.InitializeWithInstance(reactInstance); reactInstance.Initialize(); using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "RunJavaScriptBundle").Start()) { await reactInstance.InitializeBridgeAsync().ConfigureAwait(false); } return reactContext; }
private void RecreateReactContextInBackground( Func<IJavaScriptExecutor> jsExecutorFactory, JavaScriptBundleLoader jsBundleLoader) { if (_contextInitializationTask == null) { _contextInitializationTask = InitializeReactContextAsync(jsExecutorFactory, jsBundleLoader); } else { _pendingJsExecutorFactory = jsExecutorFactory; _pendingJsBundleLoader = jsBundleLoader; } }