【发布时间】:2019-04-20 03:49:50
【问题描述】:
已连接两个启用蓝牙的设备。一个通过 outputStream 向另一个发送周期性时间戳 (writeTime),后者通过 inputStream 检索 writeTimes 并附加自己的时间戳 (readTime) 以进行比较。我的目标是使每个循环的 readTime 等于 writeTime。下面的代码导致 writeTimes 以预定的延迟(3 秒)递增,但 readTimes 不递增。当两台设备相互连接时,readTimes 是固定的。这是 outputStream.write 和 inputStream.read 的 sn-ps 以及示例结果。
对于发送设备:在定时器内循环,在写入 outputStream 之间有 3 秒的延迟:有一个 CountDownTimer 驱动 onTick
public void onTick(long millisUntilFinished) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
String thisTime = mdformat.format(calendar.getTime());
tV.setText("Current Time: " + thisTime); // thisTime increments on the display in real time.
try {
thisTime=thisTime+ "^"; // "^" added as the end of a line
outputStream.write(thisTime.getBytes(Charset.forName("UTF-8")));
} catch (IOException e) {}
对于接收设备:一个读取循环(iloop),其迭代次数与来自发送方的写入循环相同:
for (iloop =1;iloop<6;iloop++) {
inputStream = socket.getInputStream();
byte[] inbyte = new byte[1];
int inbuffer;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
writeTime = "";
eol = false;
do {
inbuffer = br.read();
if (inbuffer != 94) { // character "^" (byte 94) triggers an end-of-line for each read.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(inbuffer);
inbyte = bos.toByteArray();
next = new String(inbyte, "UTF-8");
writeTime = writeTime + next;
} else {eol = true;}
} while (!eol);
readTime = mdformat.format(calendar.getTime());
readarray[iloop] = "\r\n" + writeTime + " " + readTime ;
}
}
readarray 写入后的屏幕截图:(5 行循环,写入之间有 3 秒延迟):
14:44:12 14:44:02
14:44:15 14:44:02
14:44:18 14:44:02
14:44:21 14:44:02
14:44:24 14:44:02
结论:正在读取输入流,其时间戳等于套接字连接的开始。 (在示例输出中,我在连接后等待了十秒钟,然后才开始写入 outputStream)。如何让 readTime 反映 writeTime?我的最终目标是以周期性速率从 inputStream 读取,而不是在单个批次中批量处理大量小读取。我想实时访问每次读取并知道读取发生的时间。
本帖更新: 我从 Ole VV 那里获得了见解,并简单地将以下三行代码从读取循环 (iloop) 外部移动到 readTime 上方的 iloop 内部
Calendar calendar = Calendar.getInstance();
SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
String strDate;
这解决了问题。我应该明白 calendar 是 Calendar 的一个实例,它的特性 calendar.getTime() 不会随着时钟的滴答声而改变。 过时的 SimpeDateFormat 没有问题,尽管 Ole VV 建议替换它可能在其他应用程序中有用。
【问题讨论】:
-
对不起。我花了一些时间问这个问题,但似乎无法弄清楚如何根据您的格式规则对其进行编辑。我想我必须把它挂在这里。将在没有任何帮助的情况下继续前进。
-
我不知道这是否意味着您在您的IDE中找不到缩进功能,或者您在您的问题下找不到the edit link。无论如何,我已尽我所能修复缩进。
-
顺便考虑扔掉早已过时且臭名昭著的麻烦
SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。 -
感谢 Ole VV 没有放弃我。下次我会做得更好。毫无疑问,您建议的模组将适合时间问题。我的惩罚让我感到尴尬是值得的。那种押韵 :) 关于时间函数的一个评论:似乎每种语言都有自己的约定。我最熟悉 Unix 时间戳,但不知道如何在 Java 中调用和转换它们。
-
了解网站的工作原理和使用方法需要花费一些时间,不幸的是,这让一些人望而却步。我仍然希望我可以删除我在这里提出的第一个问题(我不允许这样做)。我希望你会学习,随着时间的推移,你会发现比痛苦更多的快乐——我做到了。
标签: java android bluetooth timestamp inputstream