Skip to content

Commit 91bd4d0

Browse files
committed
networking: Fix requests failing when turning network off and on (facebook#19709).
This bug is probably actually a bug in OkHttp: square/okhttp#4079 Both issues linked above contain extensive details about the issue, its likely origins and how to reproduce it. A short summary of the issue and the fix in this commit: On Android, disconnecting from the network somehow corrupts the idle connections in okhttp clients. New requests made over these clients fail. This commit works around that bug by clearing the idle connection pool when Android disconnects from the network.
1 parent d2dd7e9 commit 91bd4d0

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

ReactAndroid/src/main/java/com/facebook/react/ReactActivity.java

+30
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,20 @@
1010
import javax.annotation.Nullable;
1111

1212
import android.app.Activity;
13+
import android.content.BroadcastReceiver;
14+
import android.content.Context;
1315
import android.content.Intent;
16+
import android.content.IntentFilter;
17+
import android.net.ConnectivityManager;
18+
import android.net.NetworkInfo;
19+
import android.os.AsyncTask;
1420
import android.os.Bundle;
1521
import android.view.KeyEvent;
1622

1723
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
1824
import com.facebook.react.modules.core.PermissionAwareActivity;
1925
import com.facebook.react.modules.core.PermissionListener;
26+
import com.facebook.react.modules.network.OkHttpClientProvider;
2027

2128
/**
2229
* Base Activity for React Native applications.
@@ -46,10 +53,33 @@ protected ReactActivityDelegate createReactActivityDelegate() {
4653
return new ReactActivityDelegate(this, getMainComponentName());
4754
}
4855

56+
private class EvictIdleConnectionsTask extends AsyncTask {
57+
@Override
58+
protected Object doInBackground(Object[] objects) {
59+
OkHttpClientProvider.getOkHttpClient().connectionPool().evictAll();
60+
return null;
61+
}
62+
}
63+
4964
@Override
5065
protected void onCreate(Bundle savedInstanceState) {
5166
super.onCreate(savedInstanceState);
5267
mDelegate.onCreate(savedInstanceState);
68+
69+
BroadcastReceiver br = new BroadcastReceiver() {
70+
@Override
71+
public void onReceive(Context context, Intent intent) {
72+
Bundle extras = intent.getExtras();
73+
NetworkInfo info = extras.getParcelable("networkInfo");
74+
NetworkInfo.State state = info.getState();
75+
if (state == NetworkInfo.State.DISCONNECTED) {
76+
new EvictIdleConnectionsTask().execute();
77+
}
78+
}
79+
};
80+
final IntentFilter intentFilter = new IntentFilter();
81+
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
82+
getApplicationContext().registerReceiver(br, intentFilter);
5383
}
5484

5585
@Override

0 commit comments

Comments
 (0)