优化: 改进线程池关闭机制,提升稳定性 | 修复线程池关闭时的变量作用域问题,优化图片尺寸获取方式避免OOM,使用BitmapFactory.Options替代直接解码,添加详细的日志记录便于问题排查,改进异常处理机制。此次改动提升了应用在处理大图片和关闭连接时的稳定性。

This commit is contained in:
SL 2025-05-31 09:19:56 +08:00
parent 9c7878d813
commit 151e9461e0
21 changed files with 81 additions and 63 deletions

View File

@ -1 +1 @@
5d168b3a13b32030e8635e7ebeeb842e
5dbf087c85cf4772c3e3c25ad17e6788

View File

@ -1 +1 @@
9adffa480b12d4cf387d65ab45c57f280d4279bb
e60da7ae73465fa023111466d6be1831d9c5e05d

View File

@ -1 +1 @@
fc1443c43330c3e40a8a2b0a6041419b3c5361a88eb4592d90fec48e622c147c
16ff7a8390ab7dc4830fdae72c918efb0bc711af52bd2405947a68aac9ef8f8b

View File

@ -1 +1 @@
c57204b220011558736e6372bb2542ab9582cd2c75da10df867746a475fd96b26198bb58b395a5d03d8d5f5174e43ab0b27536926279ea308aa2681ede1b2f7b
3986f614c58519679f099e8f3fa51e97eb836d03d2c3ac16c9bc5a068ca8788aeef58013543d890c74c1e28fafbfbe92ac01f54de67b3d7ec64f960b25f88f76

View File

@ -1 +1 @@
1ee8fd344f3bee13dedc2412ea85c8a1
c14ed31abb9a31739ed237fde77d3ca3

View File

@ -1 +1 @@
dd1019d67fe7ab08a9533e3a2d4522c837e2ae60
5d9af4f1269d318792cab589bb2fb80e6a5cc0ea

View File

@ -1 +1 @@
f1f8b7a5b49748f3f6b4765508bbae49351a04c756efb7cab1c36996fdc6fc32
dff199d5a7e342255c74a0639eeeba2c98f5e0844968074d12c92b5adf6ea140

View File

@ -1 +1 @@
e3b3bdf7e99fcffca5ff40b7d2c515e43af1975ec277883d7c3b80388253e632cf644dad984debdc92d3760e0b7c04a5ecce16c62ff9d066ef9b5c7e1f4737c9
235f469298429751b299f1b956f7c46dfd3bcea3fd2dd240859d7fbcbf5daa866d8ec5980c5bd4681dcd70e18a41434538aa7ab625694dc940309d0667d86b67

View File

@ -25,11 +25,11 @@
{
"name": "WKIMLib_local-1.0.7.aar",
"url": "WKIMLib_local-1.0.7.aar",
"size": 619450,
"sha512": "e3b3bdf7e99fcffca5ff40b7d2c515e43af1975ec277883d7c3b80388253e632cf644dad984debdc92d3760e0b7c04a5ecce16c62ff9d066ef9b5c7e1f4737c9",
"sha256": "f1f8b7a5b49748f3f6b4765508bbae49351a04c756efb7cab1c36996fdc6fc32",
"sha1": "dd1019d67fe7ab08a9533e3a2d4522c837e2ae60",
"md5": "1ee8fd344f3bee13dedc2412ea85c8a1"
"size": 619745,
"sha512": "235f469298429751b299f1b956f7c46dfd3bcea3fd2dd240859d7fbcbf5daa866d8ec5980c5bd4681dcd70e18a41434538aa7ab625694dc940309d0667d86b67",
"sha256": "dff199d5a7e342255c74a0639eeeba2c98f5e0844968074d12c92b5adf6ea140",
"sha1": "5d9af4f1269d318792cab589bb2fb80e6a5cc0ea",
"md5": "c14ed31abb9a31739ed237fde77d3ca3"
}
]
},
@ -106,11 +106,11 @@
{
"name": "WKIMLib_local-1.0.7.aar",
"url": "WKIMLib_local-1.0.7.aar",
"size": 619450,
"sha512": "e3b3bdf7e99fcffca5ff40b7d2c515e43af1975ec277883d7c3b80388253e632cf644dad984debdc92d3760e0b7c04a5ecce16c62ff9d066ef9b5c7e1f4737c9",
"sha256": "f1f8b7a5b49748f3f6b4765508bbae49351a04c756efb7cab1c36996fdc6fc32",
"sha1": "dd1019d67fe7ab08a9533e3a2d4522c837e2ae60",
"md5": "1ee8fd344f3bee13dedc2412ea85c8a1"
"size": 619745,
"sha512": "235f469298429751b299f1b956f7c46dfd3bcea3fd2dd240859d7fbcbf5daa866d8ec5980c5bd4681dcd70e18a41434538aa7ab625694dc940309d0667d86b67",
"sha256": "dff199d5a7e342255c74a0639eeeba2c98f5e0844968074d12c92b5adf6ea140",
"sha1": "5d9af4f1269d318792cab589bb2fb80e6a5cc0ea",
"md5": "c14ed31abb9a31739ed237fde77d3ca3"
}
]
},
@ -128,11 +128,11 @@
{
"name": "WKIMLib_local-1.0.7-sources.jar",
"url": "WKIMLib_local-1.0.7-sources.jar",
"size": 328923,
"sha512": "c57204b220011558736e6372bb2542ab9582cd2c75da10df867746a475fd96b26198bb58b395a5d03d8d5f5174e43ab0b27536926279ea308aa2681ede1b2f7b",
"sha256": "fc1443c43330c3e40a8a2b0a6041419b3c5361a88eb4592d90fec48e622c147c",
"sha1": "9adffa480b12d4cf387d65ab45c57f280d4279bb",
"md5": "5d168b3a13b32030e8635e7ebeeb842e"
"size": 329297,
"sha512": "3986f614c58519679f099e8f3fa51e97eb836d03d2c3ac16c9bc5a068ca8788aeef58013543d890c74c1e28fafbfbe92ac01f54de67b3d7ec64f960b25f88f76",
"sha256": "16ff7a8390ab7dc4830fdae72c918efb0bc711af52bd2405947a68aac9ef8f8b",
"sha1": "e60da7ae73465fa023111466d6be1831d9c5e05d",
"md5": "5dbf087c85cf4772c3e3c25ad17e6788"
}
]
}

View File

@ -1 +1 @@
4c79885e3a68e147b7c1224f413bcd43
111eaed649cc9dee5e583a0913eb3012

View File

@ -1 +1 @@
3dffd7d2203e1d89e3a35a90543e3db528b2682b
d8c0fb9a9a6b980505eb9d1fad11b0a94bf0cbe7

View File

@ -1 +1 @@
bcad34f63c34e515908d28d9310773b6604acf61d0bc51ae11bfc50347a2cbc4
a618ba0992e5488cf9ea18071fcc713557300974752c5c9732eb6ad8c97fdcd9

View File

@ -1 +1 @@
f8eaf05854e3bb2b3ccc00966ab79425bd88c25e170ae94dc5a4817afc6a6e2b0a7c13a6daaa98c2c070371975216f6254e99fedd5ab6f36b2b58a41257ee156
e8e79f3b8e9f67cc1a031b2470ed73cd4a630328a59dae77faa67f7c3f18c1d14c18d4def1c9e087108a23b73fb0355504a902140b46b62928572e644d580f3d

View File

@ -8,6 +8,6 @@
<versions>
<version>1.0.7</version>
</versions>
<lastUpdated>20250529025503</lastUpdated>
<lastUpdated>20250531011527</lastUpdated>
</versioning>
</metadata>

View File

@ -1 +1 @@
26ae472fcffd2fe0b04d0a3133350e8d
d094f986ea83a0500d83956747a381d5

View File

@ -1 +1 @@
7ad38bd49fd820be0253b040ef16b28958a46548
c6197607f4f126f028953ee9ccfaf20aee985f8c

View File

@ -1 +1 @@
7ba7e14099eabac8987d6198c656c4226fb155c37fb3a808eaeeb6cc7581e630
dcbb0c6090cebc3df506d1d6ea07478f0e3ddbf7cdcad2ca70da4be8b3d76cf7

View File

@ -1 +1 @@
0a2414a76b786281ac97d668dc59fb63f723659e0a1d3eb500f26c285ecbfc35b5d919c68169f6a70deb1b2f12f488ac3a5946149a7823cb1b40fae59e48a86b
b7bc976094c216e66ddf332208c845b2d2f6677f9370acfe141ed1b27123a98f72805777d0af96097d3e879bf6aef14ed2efba70d2b79971650823142bee5e15

View File

@ -154,8 +154,8 @@ public class WKConnection {
public final AtomicBoolean isClosing = new AtomicBoolean(false);
private int maxReconnectAttempts = 5;
private long baseReconnectDelay = 500;
private final int maxReconnectAttempts = 5;
private final long baseReconnectDelay = 500;
private final Object connectionStateLock = new Object();
private volatile boolean isConnecting = false;
@ -178,21 +178,39 @@ public class WKConnection {
return connectionExecutor;
}
}
private final AtomicBoolean isShuttingDown = new AtomicBoolean(false);
private void shutdownExecutor() {
if (!isShuttingDown.compareAndSet(false, true)) {
WKLoggerUtils.getInstance().w(TAG, "Executor is already shutting down");
return;
}
ExecutorService executorToShutdown;
synchronized (executorLock) {
if (connectionExecutor != null && !connectionExecutor.isShutdown()) {
connectionExecutor.shutdown();
executorToShutdown = connectionExecutor;
connectionExecutor = null;
}
if (executorToShutdown != null && !executorToShutdown.isShutdown()) {
dispatchQueuePool.execute(() -> {
try {
if (!connectionExecutor.awaitTermination(5, TimeUnit.SECONDS)) {
connectionExecutor.shutdownNow();
WKLoggerUtils.getInstance().i(TAG, "Starting executor shutdown");
executorToShutdown.shutdown();
if (!executorToShutdown.awaitTermination(3, TimeUnit.SECONDS)) {
WKLoggerUtils.getInstance().w(TAG, "Executor did not terminate in time, forcing shutdown");
executorToShutdown.shutdownNow();
}
} catch (InterruptedException e) {
connectionExecutor.shutdownNow();
WKLoggerUtils.getInstance().e(TAG, "Executor shutdown interrupted: " + e.getMessage());
executorToShutdown.shutdownNow();
Thread.currentThread().interrupt();
} finally {
isShuttingDown.set(false);
WKLoggerUtils.getInstance().i(TAG, "Executor shutdown completed");
}
}
connectionExecutor = null;
});
}
}
@ -439,7 +457,7 @@ public class WKConnection {
}
// 等待连接完成或超时
boolean connected = connectLatch.await(15000, TimeUnit.MILLISECONDS);
boolean connected = connectLatch.await(5000, TimeUnit.MILLISECONDS);
if (!connected || !connectSuccess.get()) {
WKLoggerUtils.getInstance().e(TAG, "连接建立超时或失败");
@ -646,33 +664,33 @@ public class WKConnection {
private boolean isValidStateTransition(int currentState, int newState) {
// Define valid state transitions
switch (currentState) {
case WKConnectStatus.fail:
return switch (currentState) {
case WKConnectStatus.fail ->
// From fail state, can move to connecting or success
return newState == WKConnectStatus.connecting ||
newState == WKConnectStatus.success;
case WKConnectStatus.connecting:
newState == WKConnectStatus.connecting ||
newState == WKConnectStatus.success;
case WKConnectStatus.connecting ->
// From connecting, can move to success, fail, or no network
return newState == WKConnectStatus.success ||
newState == WKConnectStatus.fail ||
newState == WKConnectStatus.noNetwork;
case WKConnectStatus.success:
newState == WKConnectStatus.success ||
newState == WKConnectStatus.fail ||
newState == WKConnectStatus.noNetwork;
case WKConnectStatus.success ->
// From success, can move to syncMsg, kicked, or fail
return newState == WKConnectStatus.syncMsg ||
newState == WKConnectStatus.kicked ||
newState == WKConnectStatus.fail;
case WKConnectStatus.syncMsg:
newState == WKConnectStatus.syncMsg ||
newState == WKConnectStatus.kicked ||
newState == WKConnectStatus.fail;
case WKConnectStatus.syncMsg ->
// From syncMsg, can move to success or fail
return newState == WKConnectStatus.success ||
newState == WKConnectStatus.fail;
case WKConnectStatus.noNetwork:
newState == WKConnectStatus.success ||
newState == WKConnectStatus.fail;
case WKConnectStatus.noNetwork ->
// From noNetwork, can move to connecting or fail
return newState == WKConnectStatus.connecting ||
newState == WKConnectStatus.fail;
default:
newState == WKConnectStatus.connecting ||
newState == WKConnectStatus.fail;
default ->
// For any other state, allow transition to fail state
return newState == WKConnectStatus.fail;
}
newState == WKConnectStatus.fail;
};
}
public void sendMessage(WKBaseMsg mBaseMsg) {