Skip to content

Commit 6372a8e

Browse files
authored
fix(Android): Remove use of AsyncTask.THREAD_POOL_EXECUTOR (#46)
1 parent 04b4be3 commit 6372a8e

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

android/src/main/java/com/asterinet/react/tcpsocket/TcpReceiverTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* notifies it's listener when data is received. This is not threadsafe, the listener
1515
* should handle synchronicity.
1616
*/
17-
public class TcpReceiverTask extends AsyncTask<Pair<TcpSocketClient, TcpReceiverTask.OnDataReceivedListener>, Void, Void> {
17+
class TcpReceiverTask extends AsyncTask<Pair<TcpSocketClient, TcpReceiverTask.OnDataReceivedListener>, Void, Void> {
1818
/**
1919
* An infinite loop to block and read data from the socket.
2020
*/

android/src/main/java/com/asterinet/react/tcpsocket/TcpSocketClient.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@
22

33
import android.content.Context;
44
import android.net.Network;
5-
import android.os.AsyncTask;
65
import android.util.Pair;
76

87
import com.facebook.react.bridge.ReadableMap;
98

10-
import java.io.OutputStream;
119
import java.io.IOException;
10+
import java.io.OutputStream;
1211
import java.net.InetAddress;
1312
import java.net.InetSocketAddress;
1413
import java.net.Socket;
1514
import java.security.GeneralSecurityException;
15+
import java.util.concurrent.ExecutorService;
16+
import java.util.concurrent.Executors;
1617

1718
import javax.net.SocketFactory;
1819
import javax.net.ssl.SSLSocket;
@@ -23,12 +24,14 @@
2324

2425
class TcpSocketClient {
2526
private final int id;
27+
private final ExecutorService executorService;
2628
private TcpReceiverTask receiverTask;
2729
private Socket socket;
2830
private TcpReceiverTask.OnDataReceivedListener mReceiverListener;
2931

3032
TcpSocketClient(final int id) {
3133
this.id = id;
34+
this.executorService = Executors.newFixedThreadPool(1);
3235
}
3336

3437
TcpSocketClient(@NonNull final TcpReceiverTask.OnDataReceivedListener receiverListener, @NonNull final Integer id, @Nullable final Socket socket) {
@@ -38,6 +41,9 @@ class TcpSocketClient {
3841
mReceiverListener = receiverListener;
3942
}
4043

44+
ExecutorService getExecutorService() {
45+
return this.executorService;
46+
}
4147

4248
public int getId() {
4349
return id;
@@ -52,7 +58,7 @@ public void connect(@NonNull final Context context, @NonNull final String addres
5258
final boolean isTls = options.hasKey("tls") && options.getBoolean("tls");
5359
if (isTls) {
5460
SocketFactory sf;
55-
if (options.hasKey("tlsCheckValidity") && !options.getBoolean("tlsCheckValidity")){
61+
if (options.hasKey("tlsCheckValidity") && !options.getBoolean("tlsCheckValidity")) {
5662
sf = SSLCertificateHelper.createBlindSocketFactory();
5763
} else {
5864
final String customTlsCert = options.hasKey("tlsCert") ? options.getString("tlsCert") : null;
@@ -89,7 +95,7 @@ public void connect(@NonNull final Context context, @NonNull final String addres
8995
@SuppressWarnings("WeakerAccess")
9096
public void startListening() {
9197
//noinspection unchecked
92-
receiverTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Pair<>(this, mReceiverListener));
98+
receiverTask.executeOnExecutor(getExecutorService(), new Pair<>(this, mReceiverListener));
9399
}
94100

95101
/**
@@ -113,6 +119,7 @@ public void close() {
113119
if (receiverTask != null && !receiverTask.isCancelled()) {
114120
// stop the receiving task
115121
receiverTask.cancel(true);
122+
getExecutorService().shutdown();
116123
}
117124
// close the socket
118125
if (socket != null && !socket.isClosed()) {

android/src/main/java/com/asterinet/react/tcpsocket/TcpSocketModule.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import android.net.ConnectivityManager;
77
import android.net.NetworkCapabilities;
88
import android.net.NetworkRequest;
9-
import android.os.AsyncTask;
109
import android.util.Base64;
1110
import android.net.Network;
1211

@@ -26,6 +25,8 @@
2625
import java.net.InetSocketAddress;
2726
import java.util.concurrent.ConcurrentHashMap;
2827
import java.util.concurrent.CountDownLatch;
28+
import java.util.concurrent.ExecutorService;
29+
import java.util.concurrent.Executors;
2930
import java.util.concurrent.ScheduledThreadPoolExecutor;
3031
import java.util.concurrent.TimeUnit;
3132

@@ -34,10 +35,12 @@
3435

3536
public class TcpSocketModule extends ReactContextBaseJavaModule implements TcpReceiverTask.OnDataReceivedListener {
3637
private static final String TAG = "TcpSockets";
38+
private static final int N_THREADS = 2;
3739
private final ReactApplicationContext mReactContext;
3840
private final ConcurrentHashMap<Integer, TcpSocketClient> socketClients = new ConcurrentHashMap<>();
3941
private final ConcurrentHashMap<String, Network> mNetworkMap = new ConcurrentHashMap<>();
4042
private final CurrentNetwork currentNetwork = new CurrentNetwork();
43+
private final ExecutorService executorService = Executors.newFixedThreadPool(N_THREADS);
4144

4245
public TcpSocketModule(ReactApplicationContext reactContext) {
4346
super(reactContext);
@@ -89,7 +92,7 @@ protected void doInBackgroundGuarded(Void... params) {
8992
onError(cId, e.getMessage());
9093
}
9194
}
92-
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
95+
}.executeOnExecutor(executorService);
9396
}
9497

9598
@SuppressLint("StaticFieldLeak")
@@ -115,7 +118,7 @@ protected void doInBackgroundGuarded(Void... params) {
115118
onError(cId, e.toString());
116119
}
117120
}
118-
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
121+
}.executeOnExecutor(executorService);
119122
}
120123

121124
@SuppressLint("StaticFieldLeak")
@@ -132,7 +135,7 @@ protected void doInBackgroundGuarded(Void... params) {
132135
socketClient.close();
133136
socketClients.remove(cId);
134137
}
135-
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
138+
}.executeOnExecutor(executorService);
136139
}
137140

138141
@SuppressWarnings("unused")
@@ -158,7 +161,7 @@ protected void doInBackgroundGuarded(Void... params) {
158161
onError(cId, uhe.getMessage());
159162
}
160163
}
161-
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
164+
}.executeOnExecutor(executorService);
162165
}
163166

164167
private void requestNetwork(final int transportType) throws InterruptedException {

android/src/main/java/com/asterinet/react/tcpsocket/TcpSocketServer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.net.ServerSocket;
1212
import java.net.Socket;
1313
import java.util.concurrent.ConcurrentHashMap;
14+
import java.util.concurrent.ExecutorService;
1415

1516
public final class TcpSocketServer extends TcpSocketClient {
1617
private ServerSocket serverSocket;
@@ -76,7 +77,7 @@ private int getClientId() {
7677

7778
private void listen() {
7879
//noinspection unchecked
79-
listening.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
80+
listening.executeOnExecutor(getExecutorService());
8081
}
8182

8283
@Override
@@ -90,6 +91,7 @@ public void close() {
9091
if (!listening.isCancelled()) {
9192
// stop the receiving task
9293
listening.cancel(true);
94+
getExecutorService().shutdown();
9395
}
9496

9597
// close the socket

0 commit comments

Comments
 (0)