[6100][adas]修复回执多线程操作崩溃问题,优化检测支持回执接口功能
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user