44
44
import com .facebook .react .bridge .ReactSoftExceptionLogger ;
45
45
import com .facebook .react .bridge .RuntimeExecutor ;
46
46
import com .facebook .react .bridge .UiThreadUtil ;
47
- import com .facebook .react .bridge .queue .QueueThreadExceptionHandler ;
48
47
import com .facebook .react .bridge .queue .ReactQueueConfiguration ;
49
48
import com .facebook .react .common .LifecycleState ;
50
49
import com .facebook .react .common .build .ReactBuildConfig ;
72
71
import java .lang .ref .WeakReference ;
73
72
import java .util .ArrayList ;
74
73
import java .util .Collection ;
75
- import java .util .Collections ;
76
74
import java .util .HashSet ;
75
+ import java .util .List ;
77
76
import java .util .Set ;
78
77
import java .util .concurrent .Executor ;
79
78
import java .util .concurrent .Executors ;
@@ -104,14 +103,10 @@ public class ReactHostImpl implements ReactHost {
104
103
private final DevSupportManager mDevSupportManager ;
105
104
private final Executor mBGExecutor ;
106
105
private final Executor mUIExecutor ;
107
- private final QueueThreadExceptionHandler mQueueThreadExceptionHandler ;
108
- private final Set <ReactSurfaceImpl > mAttachedSurfaces =
109
- Collections .synchronizedSet (new HashSet <>());
106
+ private final Set <ReactSurfaceImpl > mAttachedSurfaces = new HashSet <>();
110
107
private final MemoryPressureRouter mMemoryPressureRouter ;
111
108
private final boolean mAllowPackagerServerAccess ;
112
109
private final boolean mUseDevSupport ;
113
- private final Collection <ReactInstanceEventListener > mReactInstanceEventListeners =
114
- Collections .synchronizedList (new ArrayList <>());
115
110
116
111
// todo: T192399917 This no longer needs to store the react instance
117
112
private final BridgelessAtomicRef <Task <ReactInstance >> mCreateReactInstanceTaskRef =
@@ -133,8 +128,8 @@ public class ReactHostImpl implements ReactHost {
133
128
private @ Nullable MemoryPressureListener mMemoryPressureListener ;
134
129
private @ Nullable DefaultHardwareBackBtnHandler mDefaultHardwareBackBtnHandler ;
135
130
136
- private final Set < Function0 < Unit >> mBeforeDestroyListeners =
137
- Collections . synchronizedSet ( new HashSet <>() );
131
+ private final List < ReactInstanceEventListener > mReactInstanceEventListeners = new ArrayList <>();
132
+ private final List < Function0 < Unit >> mBeforeDestroyListeners = new ArrayList <>();
138
133
139
134
private @ Nullable ReactHostInspectorTarget mReactHostInspectorTarget ;
140
135
@@ -167,7 +162,6 @@ public ReactHostImpl(
167
162
mComponentFactory = componentFactory ;
168
163
mBGExecutor = bgExecutor ;
169
164
mUIExecutor = uiExecutor ;
170
- mQueueThreadExceptionHandler = ReactHostImpl .this ::handleHostException ;
171
165
mMemoryPressureRouter = new MemoryPressureRouter (context );
172
166
mAllowPackagerServerAccess = allowPackagerServerAccess ;
173
167
mUseDevSupport = useDevSupport ;
@@ -416,12 +410,16 @@ public boolean onBackPressed() {
416
410
417
411
/** Add a listener to be notified of ReactInstance events. */
418
412
public void addReactInstanceEventListener (ReactInstanceEventListener listener ) {
419
- mReactInstanceEventListeners .add (listener );
413
+ synchronized (mReactInstanceEventListeners ) {
414
+ mReactInstanceEventListeners .add (listener );
415
+ }
420
416
}
421
417
422
418
/** Remove a listener previously added with {@link #addReactInstanceEventListener}. */
423
419
public void removeReactInstanceEventListener (ReactInstanceEventListener listener ) {
424
- mReactInstanceEventListeners .remove (listener );
420
+ synchronized (mReactInstanceEventListeners ) {
421
+ mReactInstanceEventListeners .remove (listener );
422
+ }
425
423
}
426
424
427
425
/**
@@ -1067,7 +1065,7 @@ private Task<ReactInstance> getOrCreateReactInstanceTask() {
1067
1065
mReactHostDelegate ,
1068
1066
mComponentFactory ,
1069
1067
devSupportManager ,
1070
- mQueueThreadExceptionHandler ,
1068
+ this :: handleHostException ,
1071
1069
mUseDevSupport ,
1072
1070
getOrCreateReactHostInspectorTarget ());
1073
1071
mReactInstance = instance ;
@@ -1147,13 +1145,13 @@ class Result {
1147
1145
reactContext , getCurrentActivity ());
1148
1146
}
1149
1147
1150
- ReactInstanceEventListener [] listeners =
1151
- new ReactInstanceEventListener [mReactInstanceEventListeners .size ()];
1152
- final ReactInstanceEventListener [] finalListeners =
1153
- mReactInstanceEventListeners .toArray (listeners );
1154
-
1155
1148
log (method , "Executing ReactInstanceEventListeners" );
1156
- for (ReactInstanceEventListener listener : finalListeners ) {
1149
+ ReactInstanceEventListener [] instanceEventListeners ;
1150
+ synchronized (mReactInstanceEventListeners ) {
1151
+ instanceEventListeners =
1152
+ mReactInstanceEventListeners .toArray (new ReactInstanceEventListener [0 ]);
1153
+ }
1154
+ for (ReactInstanceEventListener listener : instanceEventListeners ) {
1157
1155
if (listener != null ) {
1158
1156
listener .onReactContextInitialized (reactContext );
1159
1157
}
@@ -1397,11 +1395,10 @@ private Task<ReactInstance> getOrCreateReloadTask(String reason) {
1397
1395
reactInstanceTaskUnwrapper .unwrap (
1398
1396
task , "3: Executing Before Destroy Listeners" );
1399
1397
1400
- Set < Function0 <Unit >> beforeDestroyListeners ;
1398
+ Function0 <Unit >[] beforeDestroyListeners ;
1401
1399
synchronized (mBeforeDestroyListeners ) {
1402
- beforeDestroyListeners = new HashSet <>( mBeforeDestroyListeners );
1400
+ beforeDestroyListeners = mBeforeDestroyListeners . toArray ( new Function0 [ 0 ] );
1403
1401
}
1404
-
1405
1402
for (Function0 <Unit > destroyListener : beforeDestroyListeners ) {
1406
1403
destroyListener .invoke ();
1407
1404
}
0 commit comments