mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-06 09:31:11 +08:00
Implement lazy discovery for ViewManagers.
Reviewed By: kathryngray Differential Revision: D5865095 fbshipit-source-id: c94970e4cd7aafb20cf844c48feea053ac8b6b0f
This commit is contained in:
committed by
Facebook Github Bot
parent
c4f7ce9afd
commit
da30b04703
@@ -17,7 +17,9 @@ import android.content.res.Configuration;
|
||||
import com.facebook.common.logging.FLog;
|
||||
import com.facebook.debug.holder.PrinterHolder;
|
||||
import com.facebook.debug.tags.ReactDebugOverlayTags;
|
||||
import com.facebook.proguard.annotations.DoNotStrip;
|
||||
import com.facebook.react.animation.Animation;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.GuardedRunnable;
|
||||
import com.facebook.react.bridge.LifecycleEventListener;
|
||||
@@ -29,6 +31,7 @@ import com.facebook.react.bridge.ReactMarker;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.common.ReactConstants;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener;
|
||||
@@ -72,6 +75,21 @@ import javax.annotation.Nullable;
|
||||
public class UIManagerModule extends ReactContextBaseJavaModule implements
|
||||
OnBatchCompleteListener, LifecycleEventListener, PerformanceCounter {
|
||||
|
||||
/**
|
||||
* Enables lazy discovery of a specific {@link ViewManager} by its name.
|
||||
*/
|
||||
public interface ViewManagerResolver {
|
||||
/**
|
||||
* {@class UIManagerModule} class uses this method to get a ViewManager by its name.
|
||||
* This is the same name that comes from JS by {@code UIManager.ViewManagerName} call.
|
||||
*/
|
||||
@Nullable ViewManager getViewManager(String viewManagerName);
|
||||
|
||||
/**
|
||||
* Provides a list of view manager names to register in JS as {@code UIManager.ViewManagerName}
|
||||
*/
|
||||
List<String> getViewManagerNames();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves a name coming from native side to a name of the event that is exposed to JS.
|
||||
@@ -90,6 +108,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements
|
||||
|
||||
private final EventDispatcher mEventDispatcher;
|
||||
private final Map<String, Object> mModuleConstants;
|
||||
private final Map<String, Object> mCustomDirectEvents;
|
||||
private final UIImplementation mUIImplementation;
|
||||
private final MemoryTrimCallback mMemoryTrimCallback = new MemoryTrimCallback();
|
||||
|
||||
@@ -97,24 +116,45 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements
|
||||
|
||||
public UIManagerModule(
|
||||
ReactApplicationContext reactContext,
|
||||
List<ViewManager> viewManagerList,
|
||||
ViewManagerResolver viewManagerResolver,
|
||||
UIImplementationProvider uiImplementationProvider,
|
||||
boolean lazyViewManagersEnabled,
|
||||
int minTimeLeftInFrameForNonBatchedOperationMs) {
|
||||
super(reactContext);
|
||||
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext);
|
||||
mEventDispatcher = new EventDispatcher(reactContext);
|
||||
mModuleConstants = createConstants(viewManagerList, lazyViewManagersEnabled);
|
||||
mModuleConstants = createConstants(viewManagerResolver);
|
||||
mCustomDirectEvents = UIManagerModuleConstants.getDirectEventTypeConstants();
|
||||
mUIImplementation =
|
||||
uiImplementationProvider.createUIImplementation(
|
||||
reactContext,
|
||||
viewManagerList,
|
||||
viewManagerResolver,
|
||||
mEventDispatcher,
|
||||
minTimeLeftInFrameForNonBatchedOperationMs);
|
||||
|
||||
reactContext.addLifecycleEventListener(this);
|
||||
}
|
||||
|
||||
public UIManagerModule(
|
||||
ReactApplicationContext reactContext,
|
||||
List<ViewManager> viewManagersList,
|
||||
UIImplementationProvider uiImplementationProvider,
|
||||
int minTimeLeftInFrameForNonBatchedOperationMs) {
|
||||
super(reactContext);
|
||||
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext);
|
||||
mEventDispatcher = new EventDispatcher(reactContext);
|
||||
mModuleConstants = createConstants(viewManagersList);
|
||||
mCustomDirectEvents =
|
||||
(Map<String, Object>) mModuleConstants.get(
|
||||
UIManagerModuleConstantsHelper.CUSTOM_DIRECT_EVENTS_KEY);
|
||||
mUIImplementation =
|
||||
uiImplementationProvider.createUIImplementation(
|
||||
reactContext,
|
||||
viewManagersList,
|
||||
mEventDispatcher,
|
||||
minTimeLeftInFrameForNonBatchedOperationMs);
|
||||
|
||||
reactContext.addLifecycleEventListener(this);
|
||||
}
|
||||
/**
|
||||
* This method gives an access to the {@link UIImplementation} object that can be used to execute
|
||||
* operations on the view hierarchy.
|
||||
@@ -163,21 +203,55 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements
|
||||
ViewManagerPropertyUpdater.clear();
|
||||
}
|
||||
|
||||
private static Map<String, Object> createConstants(
|
||||
List<ViewManager> viewManagerList,
|
||||
boolean lazyViewManagersEnabled) {
|
||||
private static Map<String, Object> createConstants(ViewManagerResolver viewManagerResolver) {
|
||||
ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_CONSTANTS_START);
|
||||
Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "CreateUIManagerConstants");
|
||||
try {
|
||||
return UIManagerModuleConstantsHelper.createConstants(
|
||||
viewManagerList,
|
||||
lazyViewManagersEnabled);
|
||||
return UIManagerModuleConstantsHelper.createConstants(viewManagerResolver);
|
||||
} finally {
|
||||
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
|
||||
ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_CONSTANTS_END);
|
||||
}
|
||||
}
|
||||
|
||||
private static Map<String, Object> createConstants(List<ViewManager> viewManagers) {
|
||||
ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_CONSTANTS_START);
|
||||
Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "CreateUIManagerConstants");
|
||||
try {
|
||||
return UIManagerModuleConstantsHelper.createConstants(viewManagers);
|
||||
} finally {
|
||||
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
|
||||
ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_CONSTANTS_END);
|
||||
}
|
||||
}
|
||||
|
||||
@DoNotStrip
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public @Nullable WritableMap getConstantsForViewManager(final String viewManagerName) {
|
||||
ViewManager targetView =
|
||||
viewManagerName != null ? mUIImplementation.resolveViewManager(viewManagerName) : null;
|
||||
if (targetView == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
SystraceMessage.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "constants for ViewManager")
|
||||
.arg("ViewManager", targetView.getName())
|
||||
.arg("Lazy", true)
|
||||
.flush();
|
||||
try {
|
||||
Map<String, Object> viewManagerConstants =
|
||||
UIManagerModuleConstantsHelper.createConstantsForViewManager(
|
||||
targetView,
|
||||
UIManagerModuleConstants.getBubblingEventTypeConstants(),
|
||||
UIManagerModuleConstants.getDirectEventTypeConstants(),
|
||||
null,
|
||||
mCustomDirectEvents);
|
||||
return viewManagerConstants != null ? Arguments.makeNativeMap(viewManagerConstants) : null;
|
||||
} finally {
|
||||
SystraceMessage.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves Direct Event name exposed to JS from the one known to the Native side.
|
||||
*/
|
||||
@@ -185,14 +259,10 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements
|
||||
return new CustomEventNamesResolver() {
|
||||
@Override
|
||||
public @Nullable String resolveCustomEventName(String eventName) {
|
||||
Map<String, Map> directEventTypes =
|
||||
(Map<String, Map>) getConstants().get(
|
||||
UIManagerModuleConstantsHelper.CUSTOM_DIRECT_EVENT_TYPES_KEY);
|
||||
if (directEventTypes != null) {
|
||||
Map<String, String> customEventType = (Map<String, String>) directEventTypes.get(eventName);
|
||||
if (customEventType != null) {
|
||||
return customEventType.get("registrationName");
|
||||
}
|
||||
Map<String, String> customEventType =
|
||||
(Map<String, String>) mCustomDirectEvents.get(eventName);
|
||||
if (customEventType != null) {
|
||||
return customEventType.get("registrationName");
|
||||
}
|
||||
return eventName;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user