diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java index 2a2373b769..32275156c4 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java @@ -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 list = Collections.synchronizedList(new ArrayList<>()); - private final AtomicBoolean isSupport = new AtomicBoolean(false);//是否支持回执功能 + private final ConcurrentLinkedQueue 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 iterator = list.iterator(); + + Iterator 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 iterator = list.iterator(); + Iterator 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();