[6100][adas]修复回执多线程操作崩溃问题,优化检测支持回执接口功能

This commit is contained in:
xinfengkun
2025-01-22 14:46:13 +08:00
parent 4240963ad9
commit 0fbcbe7632

View File

@@ -5,13 +5,11 @@ import androidx.annotation.NonNull;
import com.zhjt.mogo.adas.common.MessageType;
import com.zhjt.mogo.adas.data.bean.ReceivedAck;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import mogo.telematics.pad.MessagePad;
@@ -22,8 +20,8 @@ public class ReceivedAckManager {
private static final String TAG = ReceivedAckManager.class.getSimpleName();
private volatile Timer timer;
private final List<ReceivedAck> list = Collections.synchronizedList(new ArrayList<>());
private final AtomicBoolean isSupport = new AtomicBoolean(false);//是否支持回执功能
private final ConcurrentLinkedQueue<ReceivedAck> queue = new ConcurrentLinkedQueue<>();
private final AtomicInteger isSupport = new AtomicInteger(-1);//是否支持回执功能 -1未知 0不支持 1支持
private OnReceivedAckListener listener;
public void setListener(OnReceivedAckListener listener) {
@@ -47,10 +45,10 @@ public class ReceivedAckManager {
}
public void setSupport(int version) {
isSupport.set(version >= 30800);
CupidLogUtils.log(TAG, version + " 是否支持回执功能=" + isSupport.get());
if (!isSupport.get()) {
stop();
isSupport.set(version >= 30800 ? 1 : 0);
CupidLogUtils.log(TAG, version + " 是否支持回执功能=" + (isSupport.get() == 1));
if (isSupport.get() != 1) {
destroy();
}
}
@@ -63,11 +61,13 @@ public class ReceivedAckManager {
* @param sendData
*/
public void addNeedAckData(long sendTime, long msgId, MessageType messageType, byte[] sendData) {
if (isSupport.get()) {
if (isSupport.get() == -1 || isSupport.get() == 1) {
queue.add(new ReceivedAck(sendTime, msgId, messageType, sendData));
}
if (isSupport.get() == 1) {
start();
list.add(new ReceivedAck(sendTime, msgId, messageType, sendData));
} else {
stop();
} else if (isSupport.get() == 0) {
destroy();
}
}
@@ -78,8 +78,13 @@ public class ReceivedAckManager {
* @param receivedAck 回执数据
*/
public void receiveReceivedAck(long time, MessagePad.ReceivedAck receivedAck) {
if (isSupport.get() != 1) {
isSupport.set(1);
CupidLogUtils.log(TAG, "当前域控版本支持回执功能");
start();
}
int count = receivedAck.getMsgidsCount();
if (count == 0 || list.isEmpty()) {
if (count == 0 || queue.isEmpty()) {
if (listener != null) {
ReceivedAck ack = new ReceivedAck(0, 0, MessageType.TYPE_DEFAULT, null);
ack.setStatus(count == 0 ? ReceivedAck.Status.RECEIVED_ACK_DATA_ERROR : ReceivedAck.Status.WAITING_RECEIVED_ACK_LIST_EMPTY);
@@ -89,7 +94,8 @@ public class ReceivedAckManager {
}
return;
}
Iterator<ReceivedAck> iterator = list.iterator();
Iterator<ReceivedAck> iterator = queue.iterator();
while (iterator.hasNext()) {
ReceivedAck ack = iterator.next();
for (int i = 0; i < count; i++) {
@@ -114,9 +120,9 @@ public class ReceivedAckManager {
timer.schedule(new TimerTask() {
@Override
public void run() {
if (!list.isEmpty()) {
if (!queue.isEmpty()) {
long time = System.currentTimeMillis();
Iterator<ReceivedAck> iterator = list.iterator();
Iterator<ReceivedAck> iterator = queue.iterator();
while (iterator.hasNext()) {
ReceivedAck ack = iterator.next();
long t = ack.getMessageType().timeoutMillis;
@@ -136,8 +142,13 @@ public class ReceivedAckManager {
}
public void stop() {
if (!list.isEmpty()) {
list.clear();
destroy();
isSupport.set(-1);
}
private void destroy() {
if (!queue.isEmpty()) {
queue.clear();
}
if (timer != null) {
timer.cancel();