mirror of
https://github.com/WuKongIM/WuKongIMAndroidSDK
synced 2025-06-06 17:50:53 +00:00
优化: 改进线程池关闭机制,提升稳定性 | 修复线程池关闭时的变量作用域问题,优化图片尺寸获取方式避免OOM,使用BitmapFactory.Options替代直接解码,添加详细的日志记录便于问题排查,改进异常处理机制。此次改动提升了应用在处理大图片和关闭连接时的稳定性。
This commit is contained in:
parent
9c7878d813
commit
151e9461e0
Binary file not shown.
@ -1 +1 @@
|
||||
5d168b3a13b32030e8635e7ebeeb842e
|
||||
5dbf087c85cf4772c3e3c25ad17e6788
|
@ -1 +1 @@
|
||||
9adffa480b12d4cf387d65ab45c57f280d4279bb
|
||||
e60da7ae73465fa023111466d6be1831d9c5e05d
|
@ -1 +1 @@
|
||||
fc1443c43330c3e40a8a2b0a6041419b3c5361a88eb4592d90fec48e622c147c
|
||||
16ff7a8390ab7dc4830fdae72c918efb0bc711af52bd2405947a68aac9ef8f8b
|
@ -1 +1 @@
|
||||
c57204b220011558736e6372bb2542ab9582cd2c75da10df867746a475fd96b26198bb58b395a5d03d8d5f5174e43ab0b27536926279ea308aa2681ede1b2f7b
|
||||
3986f614c58519679f099e8f3fa51e97eb836d03d2c3ac16c9bc5a068ca8788aeef58013543d890c74c1e28fafbfbe92ac01f54de67b3d7ec64f960b25f88f76
|
Binary file not shown.
@ -1 +1 @@
|
||||
1ee8fd344f3bee13dedc2412ea85c8a1
|
||||
c14ed31abb9a31739ed237fde77d3ca3
|
@ -1 +1 @@
|
||||
dd1019d67fe7ab08a9533e3a2d4522c837e2ae60
|
||||
5d9af4f1269d318792cab589bb2fb80e6a5cc0ea
|
@ -1 +1 @@
|
||||
f1f8b7a5b49748f3f6b4765508bbae49351a04c756efb7cab1c36996fdc6fc32
|
||||
dff199d5a7e342255c74a0639eeeba2c98f5e0844968074d12c92b5adf6ea140
|
@ -1 +1 @@
|
||||
e3b3bdf7e99fcffca5ff40b7d2c515e43af1975ec277883d7c3b80388253e632cf644dad984debdc92d3760e0b7c04a5ecce16c62ff9d066ef9b5c7e1f4737c9
|
||||
235f469298429751b299f1b956f7c46dfd3bcea3fd2dd240859d7fbcbf5daa866d8ec5980c5bd4681dcd70e18a41434538aa7ab625694dc940309d0667d86b67
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
4c79885e3a68e147b7c1224f413bcd43
|
||||
111eaed649cc9dee5e583a0913eb3012
|
@ -1 +1 @@
|
||||
3dffd7d2203e1d89e3a35a90543e3db528b2682b
|
||||
d8c0fb9a9a6b980505eb9d1fad11b0a94bf0cbe7
|
@ -1 +1 @@
|
||||
bcad34f63c34e515908d28d9310773b6604acf61d0bc51ae11bfc50347a2cbc4
|
||||
a618ba0992e5488cf9ea18071fcc713557300974752c5c9732eb6ad8c97fdcd9
|
@ -1 +1 @@
|
||||
f8eaf05854e3bb2b3ccc00966ab79425bd88c25e170ae94dc5a4817afc6a6e2b0a7c13a6daaa98c2c070371975216f6254e99fedd5ab6f36b2b58a41257ee156
|
||||
e8e79f3b8e9f67cc1a031b2470ed73cd4a630328a59dae77faa67f7c3f18c1d14c18d4def1c9e087108a23b73fb0355504a902140b46b62928572e644d580f3d
|
@ -8,6 +8,6 @@
|
||||
<versions>
|
||||
<version>1.0.7</version>
|
||||
</versions>
|
||||
<lastUpdated>20250529025503</lastUpdated>
|
||||
<lastUpdated>20250531011527</lastUpdated>
|
||||
</versioning>
|
||||
</metadata>
|
||||
|
@ -1 +1 @@
|
||||
26ae472fcffd2fe0b04d0a3133350e8d
|
||||
d094f986ea83a0500d83956747a381d5
|
@ -1 +1 @@
|
||||
7ad38bd49fd820be0253b040ef16b28958a46548
|
||||
c6197607f4f126f028953ee9ccfaf20aee985f8c
|
@ -1 +1 @@
|
||||
7ba7e14099eabac8987d6198c656c4226fb155c37fb3a808eaeeb6cc7581e630
|
||||
dcbb0c6090cebc3df506d1d6ea07478f0e3ddbf7cdcad2ca70da4be8b3d76cf7
|
@ -1 +1 @@
|
||||
0a2414a76b786281ac97d668dc59fb63f723659e0a1d3eb500f26c285ecbfc35b5d919c68169f6a70deb1b2f12f488ac3a5946149a7823cb1b40fae59e48a86b
|
||||
b7bc976094c216e66ddf332208c845b2d2f6677f9370acfe141ed1b27123a98f72805777d0af96097d3e879bf6aef14ed2efba70d2b79971650823142bee5e15
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user