1313import com .facebook .common .logging .FLog ;
1414import com .facebook .infer .annotation .Assertions ;
1515import com .facebook .react .bridge .ReactContext ;
16+ import com .facebook .react .bridge .UiThreadUtil ;
17+ import com .facebook .react .R ;
1618import com .facebook .react .common .ReactConstants ;
1719import com .facebook .react .common .build .ReactBuildConfig ;
1820import com .facebook .react .devsupport .interfaces .DevBundleDownloadListener ;
@@ -113,6 +115,7 @@ public String typeID() {
113115 private final PackagerStatusCheck mPackagerStatusCheck ;
114116 private final String mPackageName ;
115117
118+ private boolean mPackagerConnectionLock = false ;
116119 private @ Nullable JSPackagerClient mPackagerClient ;
117120 private @ Nullable InspectorPackagerConnection mInspectorPackagerConnection ;
118121 private InspectorPackagerConnection .BundleStatusProvider mBundlerStatusProvider ;
@@ -136,13 +139,14 @@ public DevServerHelper(
136139
137140 public void openPackagerConnection (
138141 final String clientId , final PackagerCommandListener commandListener ) {
139- if (mPackagerClient != null ) {
142+ if (mPackagerClient != null || mPackagerConnectionLock ) {
140143 FLog .w (ReactConstants .TAG , "Packager connection already open, nooping." );
141144 return ;
142145 }
143- new AsyncTask <Void , Void , Void >() {
146+ mPackagerConnectionLock = true ;
147+ new AsyncTask <Void , Void , JSPackagerClient >() {
144148 @ Override
145- protected Void doInBackground (Void ... backgroundParams ) {
149+ protected JSPackagerClient doInBackground (Void ... backgroundParams ) {
146150 Map <String , RequestHandler > handlers = new HashMap <>();
147151 handlers .put (
148152 "reload" ,
@@ -187,30 +191,49 @@ public void onDisconnected() {
187191 }
188192 };
189193
190- mPackagerClient =
194+ JSPackagerClient packagerClient =
191195 new JSPackagerClient (
192196 clientId ,
193197 mSettings .getPackagerConnectionSettings (),
194198 handlers ,
195199 onPackagerConnectedCallback );
196- mPackagerClient .init ();
200+ packagerClient .init ();
197201
198- return null ;
202+ return packagerClient ;
203+ }
204+
205+ @ Override
206+ protected void onPostExecute (JSPackagerClient packagerClient ) {
207+ UiThreadUtil .assertOnUiThread ();
208+ mPackagerClient = packagerClient ;
209+ mPackagerConnectionLock = false ;
199210 }
200211 }.executeOnExecutor (AsyncTask .THREAD_POOL_EXECUTOR );
201212 }
202213
203214 public void closePackagerConnection () {
204- new AsyncTask <Void , Void , Void >() {
215+ if (mPackagerConnectionLock ) {
216+ FLog .w (ReactConstants .TAG , "Packager connection lock acquired, cannot close current connection." );
217+ return ;
218+ }
219+ mPackagerConnectionLock = true ;
220+ new AsyncTask <JSPackagerClient , Void , Void >() {
205221 @ Override
206- protected Void doInBackground (Void ... params ) {
207- if (mPackagerClient != null ) {
208- mPackagerClient . close () ;
209- mPackagerClient = null ;
222+ protected Void doInBackground (JSPackagerClient ... params ) {
223+ if (params . length > 0 && params [ 0 ] != null ) {
224+ JSPackagerClient packagerClient = params [ 0 ] ;
225+ packagerClient . close () ;
210226 }
211227 return null ;
212228 }
213- }.executeOnExecutor (AsyncTask .THREAD_POOL_EXECUTOR );
229+
230+ @ Override
231+ protected void onPostExecute (Void result ) {
232+ UiThreadUtil .assertOnUiThread ();
233+ mPackagerClient = null ;
234+ mPackagerConnectionLock = false ;
235+ }
236+ }.executeOnExecutor (AsyncTask .THREAD_POOL_EXECUTOR , mPackagerClient );
214237 }
215238
216239 public void openInspectorConnection () {
0 commit comments