串口通信要求没收到返回重新发送,最多三次。三次过后提示无响应。早前试过用postdelay,然后收到数据后用removeall,这样其实所有的都被清除了,不是对应的命令。而且代码非常不美观,runnable很多。(问题其实也很多)
后来发送的使用延时队列
public void send(byte[] data,int DP) {
for(int i = 0;i<4;i++){
DelayFrame one = new DelayFrame(DP,data,i);
delayQueue.offer(one);
}
}
class DelayRunnable implements Runnable {
@Override
public void run() {
while (isRunnable) {
try {
DelayFrame frame = delayQueue.take();
if (frame.getTimes() == 3) {
EventBus.getDefault().post(new FrameBean(999));
continue;
}
if (mOutputStream != null) {
mOutputStream.write(frame.getData());
mOutputStream.flush();
}
} catch (Exception e) {
System.out.println("233333333:"+e.getMessage());
throw new RuntimeException(e);
}
}
}
}
take()是阻塞的,会等到下一个到期的事件,每次发送的时候添加4个事件。具体DelayFrame代码
public class DelayFrame implements Delayed {
private final long endTime;
private final int DP;
private final int times;
private final byte[] data;
public DelayFrame(int DP, byte[] data,int times) {
this.DP = DP;
this.data = data;
this.times = times;
int delayTime = 1000;
this.endTime = System.currentTimeMillis() + (long) delayTime *times;
}
public int getDP() {
return DP;
}
public byte[] getData() {
return data;
}
public int getTimes() {
return times;
}
@Override
public long getDelay(TimeUnit unit) {
long remainingDelay = endTime - System.currentTimeMillis();
if (remainingDelay <= 0) {
return 0;
}
return unit.convert(remainingDelay, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.endTime, ((DelayFrame) o).endTime);
}
}
最后收到数据后删除对应还没到期的
private void removeDelay(int dp){
Iterator<DelayFrame> iterator = delayQueue.iterator();
while (iterator.hasNext()) {
DelayFrame frame = iterator.next();
if(frame.getDP() == dp) {
iterator.remove();
}
}
}