Skip to content

Commit 5fc0408

Browse files
fix(android): Leaking listeners (#118)
* Fix condition in RNPerformance.removeListener * Fix ReactMarker listener leak * Use invalidate instead of deprecated onCatalystInstanceDestroyed and add missing method from spec * Prevent leaking listener when getPackages is called multiple times * Remove unused method * Remove comments * Remove override --------- Co-authored-by: Joel Arvidsson <joel@oblador.se>
1 parent 78e2e83 commit 5fc0408

File tree

2 files changed

+71
-65
lines changed

2 files changed

+71
-65
lines changed

packages/react-native-performance/android/src/main/java/com/oblador/performance/PerformanceModule.java

Lines changed: 70 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -25,64 +25,82 @@ public class PerformanceModule extends ReactContextBaseJavaModule implements Tur
2525
private static final Queue<PerformanceEntry> markBuffer = new ConcurrentLinkedQueue<>();
2626
private static boolean didEmit = false;
2727

28+
private static final ReactMarker.MarkerListener startupMarkerListener = (name, tag, instanceKey) -> {
29+
switch (name) {
30+
case RELOAD:
31+
clearMarkBuffer();
32+
addMark(new PerformanceMark(BRIDGE_SETUP_START, SystemClock.uptimeMillis()));
33+
break;
34+
case ATTACH_MEASURED_ROOT_VIEWS_END:
35+
case ATTACH_MEASURED_ROOT_VIEWS_START:
36+
case BUILD_NATIVE_MODULE_REGISTRY_END:
37+
case BUILD_NATIVE_MODULE_REGISTRY_START:
38+
case CONTENT_APPEARED:
39+
case CREATE_CATALYST_INSTANCE_END:
40+
case CREATE_CATALYST_INSTANCE_START:
41+
case CREATE_REACT_CONTEXT_END:
42+
case CREATE_REACT_CONTEXT_START:
43+
case CREATE_UI_MANAGER_MODULE_CONSTANTS_END:
44+
case CREATE_UI_MANAGER_MODULE_CONSTANTS_START:
45+
case CREATE_UI_MANAGER_MODULE_END:
46+
case CREATE_UI_MANAGER_MODULE_START:
47+
case CREATE_VIEW_MANAGERS_END:
48+
case CREATE_VIEW_MANAGERS_START:
49+
case DOWNLOAD_END:
50+
case DOWNLOAD_START:
51+
case LOAD_REACT_NATIVE_SO_FILE_END:
52+
case LOAD_REACT_NATIVE_SO_FILE_START:
53+
case PRE_RUN_JS_BUNDLE_START:
54+
case PRE_SETUP_REACT_CONTEXT_END:
55+
case PRE_SETUP_REACT_CONTEXT_START:
56+
case PROCESS_CORE_REACT_PACKAGE_END:
57+
case PROCESS_CORE_REACT_PACKAGE_START:
58+
case REACT_CONTEXT_THREAD_END:
59+
case REACT_CONTEXT_THREAD_START:
60+
case RUN_JS_BUNDLE_END:
61+
case RUN_JS_BUNDLE_START:
62+
case SETUP_REACT_CONTEXT_END:
63+
case SETUP_REACT_CONTEXT_START:
64+
case VM_INIT:
65+
long startTime = SystemClock.uptimeMillis();
66+
addMark(new PerformanceMark(getMarkName(name), startTime));
67+
break;
68+
}
69+
};
70+
71+
private final ReactMarker.MarkerListener contentAppearedListener = (name, tag, instanceKey) -> {
72+
switch (name) {
73+
case CONTENT_APPEARED:
74+
eventsBuffered = false;
75+
emitNativeStartupTime();
76+
emitBufferedMarks();
77+
break;
78+
case RELOAD:
79+
eventsBuffered = true;
80+
break;
81+
}
82+
};
83+
2884
public PerformanceModule(@NonNull final ReactApplicationContext reactContext) {
2985
super(reactContext);
3086
setupMarkerListener();
3187
setupNativeMarkerListener();
3288
}
3389

90+
private void setupMarkerListener() {
91+
ReactMarker.addListener(
92+
contentAppearedListener
93+
);
94+
}
95+
3496
private void setupNativeMarkerListener() {
3597
RNPerformance.getInstance().addListener(this);
3698
}
3799

38100
// Need to set up the marker listener before the react module is initialized
39101
// to capture all events
40102
public static void setupListener() {
41-
ReactMarker.addListener(
42-
(name, tag, instanceKey) -> {
43-
switch (name) {
44-
case RELOAD:
45-
clearMarkBuffer();
46-
addMark(new PerformanceMark(BRIDGE_SETUP_START, SystemClock.uptimeMillis()));
47-
break;
48-
case ATTACH_MEASURED_ROOT_VIEWS_END:
49-
case ATTACH_MEASURED_ROOT_VIEWS_START:
50-
case BUILD_NATIVE_MODULE_REGISTRY_END:
51-
case BUILD_NATIVE_MODULE_REGISTRY_START:
52-
case CONTENT_APPEARED:
53-
case CREATE_CATALYST_INSTANCE_END:
54-
case CREATE_CATALYST_INSTANCE_START:
55-
case CREATE_REACT_CONTEXT_END:
56-
case CREATE_REACT_CONTEXT_START:
57-
case CREATE_UI_MANAGER_MODULE_CONSTANTS_END:
58-
case CREATE_UI_MANAGER_MODULE_CONSTANTS_START:
59-
case CREATE_UI_MANAGER_MODULE_END:
60-
case CREATE_UI_MANAGER_MODULE_START:
61-
case CREATE_VIEW_MANAGERS_END:
62-
case CREATE_VIEW_MANAGERS_START:
63-
case DOWNLOAD_END:
64-
case DOWNLOAD_START:
65-
case LOAD_REACT_NATIVE_SO_FILE_END:
66-
case LOAD_REACT_NATIVE_SO_FILE_START:
67-
case PRE_RUN_JS_BUNDLE_START:
68-
case PRE_SETUP_REACT_CONTEXT_END:
69-
case PRE_SETUP_REACT_CONTEXT_START:
70-
case PROCESS_CORE_REACT_PACKAGE_END:
71-
case PROCESS_CORE_REACT_PACKAGE_START:
72-
case REACT_CONTEXT_THREAD_END:
73-
case REACT_CONTEXT_THREAD_START:
74-
case RUN_JS_BUNDLE_END:
75-
case RUN_JS_BUNDLE_START:
76-
case SETUP_REACT_CONTEXT_END:
77-
case SETUP_REACT_CONTEXT_START:
78-
case VM_INIT:
79-
long startTime = SystemClock.uptimeMillis();
80-
addMark(new PerformanceMark(getMarkName(name), startTime));
81-
break;
82-
83-
}
84-
}
85-
);
103+
ReactMarker.addListener(startupMarkerListener);
86104
}
87105

88106
private static void clearMarkBuffer() {
@@ -123,23 +141,6 @@ private void emitNativeStartupTime() {
123141
safelyEmitMark(new PerformanceMark("nativeLaunchEnd", StartTimeProvider.getEndTime()));
124142
}
125143

126-
private void setupMarkerListener() {
127-
ReactMarker.addListener(
128-
(name, tag, instanceKey) -> {
129-
switch (name) {
130-
case CONTENT_APPEARED:
131-
eventsBuffered = false;
132-
emitNativeStartupTime();
133-
emitBufferedMarks();
134-
break;
135-
case RELOAD:
136-
eventsBuffered = true;
137-
break;
138-
}
139-
}
140-
);
141-
}
142-
143144
private void safelyEmitMark(PerformanceEntry entry) {
144145
if (eventsBuffered) {
145146
addMark(entry);
@@ -217,13 +218,18 @@ public void logMarker(PerformanceEntry entry) {
217218
}
218219

219220
@Override
220-
public void onCatalystInstanceDestroy() {
221-
super.onCatalystInstanceDestroy();
221+
public void invalidate() {
222+
super.invalidate();
222223
RNPerformance.getInstance().removeListener(this);
224+
ReactMarker.removeListener(contentAppearedListener);
223225
}
224226

225227
// Fix new arch runtime error
226228
public void addListener(String eventName) {
227229

228230
}
231+
232+
public void removeListeners(double count) {
233+
234+
}
229235
}

packages/react-native-performance/android/src/main/java/com/oblador/performance/RNPerformance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected void addListener(MarkerListener listener) {
4343

4444
@DoNotStrip
4545
protected void removeListener(MarkerListener listener) {
46-
if (!sListeners.contains(listener)) {
46+
if (sListeners.contains(listener)) {
4747
sListeners.remove(listener);
4848
}
4949
}

0 commit comments

Comments
 (0)