Java Android Bluetooth对inputStream和outputStream的定期调用:不一致的时间戳

Java Android Bluetooth对inputStream和outputStream的定期调用:不一致的时间戳,java,android,bluetooth,timestamp,inputstream,Java,Android,Bluetooth,Timestamp,Inputstream,已连接两个支持蓝牙的设备。一个通过outputStream向另一个发送周期性时间戳(writeTime),后者通过inputStream检索writeTime,并附加自己的时间戳(readTime)进行比较。我的目标是使每个循环的readTime等于writeTime。下面的代码导致写入时间以预定的延迟(3秒)递增,但读取时间不递增。读取时间在两个设备相互连接时固定。以下是outputStream.write和inputStream.read的片段以及示例结果 对于发送设备:在写入outputS

已连接两个支持蓝牙的设备。一个通过outputStream向另一个发送周期性时间戳(writeTime),后者通过inputStream检索writeTime,并附加自己的时间戳(readTime)进行比较。我的目标是使每个循环的readTime等于writeTime。下面的代码导致写入时间以预定的延迟(3秒)递增,但读取时间不递增。读取时间在两个设备相互连接时固定。以下是outputStream.write和inputStream.read的片段以及示例结果

对于发送设备:在写入outputStream之间有三秒延迟的计时器内循环:有一个倒计时驱动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 ;
        }
    }
结论:正在读取的inputStream的时间戳等于套接字连接的开始。 (在示例输出中,我在连接后等待了十秒钟,然后开始写入outputStream)。如何获取readTime以反映写入时间?我的最终目标是以周期性的速率从inputStream读取,而不是在单个批处理中批处理大量的小读取。我想实时访问每次读取,并知道读取何时发生

本帖最新消息: 我从OLEV中获得了一些见解,并简单地将以下三行代码从读取循环(iloop)之外移到了读取时间之上的iloop内部

  Calendar calendar = Calendar.getInstance();
  SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
  String strDate;
这就解决了问题。我应该知道calendar是calendar的一个实例,其特征calendar.getTime()不会随着时钟的滴答声而改变。 过时的SimpeDateFormat没有问题,尽管Ole VVs建议替换它在其他应用程序中可能有用。

java.time 要将当前时间(例如从流中读取的时间)放入字符串中,请执行以下操作:

    DateTimeFormatter timeFormatter
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
    String readTime = LocalTime.now(ZoneId.of("America/Dawson"))
            .format(timeFormatter);
DateTimeFormatter
可以在循环外部创建,但必须在循环内部调用
LocalTime.now
以获取当前迭代的时间

我的语言环境中的示例结果是字符串
11.57.13
。请将我放置在美国/道森的时区替换为您想要的时区

我使用的是java.time,现代java日期和时间API,因为您使用的日期和时间类,
Calendar
SimpleDateFormat
,总是有设计问题,现在已经过时很久了。考虑不再使用它们。< /P> 你的代码出了什么问题? 您还没有提供完整的示例,因此问题中的代码片段无法按原样编译和运行,我也无法完全解释。但是,您似乎已经在循环之外创建了一个
日历
对象,并且以后不会修改该
日历
对象的时间。因此它保持它的时间,而这个时间就是你每次通过循环得到的时间。(相比之下,在书写端,每次调用
onTick
,都会创建一个新的
Calendar
对象,这就是为什么每次都会得到当前时间。)

问题:我可以在Android上使用java.time吗? 是的,
java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6

  • 在Java8和更高版本以及新的Android设备(API级别26)上,新的API是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310,其中最早描述了现代API)
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它叫ThreeTenABP。确保从package
    org.threeten.bp
    和子package导入日期和时间类
链接
  • ,解释如何使用
    java.time
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

对不起。我花了一些时间问这个问题,但似乎不知道如何根据您的格式规则编辑它。我想我必须把它挂在这里。我不知道这是否意味着你在IDE中找不到缩进函数,或者在你的问题下找不到缩进函数。在任何情况下,我都把缩进固定到了我的最佳状态。作为一个旁白,考虑扔掉长期过时的和臭名昭著的麻烦代码< SimpleDateFormat >代码>和朋友,并添加到Android项目中,以便使用JavaAtTimes,现代java日期和时间API。和我一起工作真是太好了。谢谢Ole VV没有放弃我。下次我会做得更好。毫无疑问,您建议的MOD将适合时间问题。我的惩罚是值得的。这种押韵:)关于时间功能的一个评论:似乎每种语言都有自己的惯例。我对Unix时间戳非常熟悉,但看不到如何在Java中调用和转换时间戳。了解该网站的工作原理和使用方法需要一点时间,不幸的是,这让一些人感到害怕。我仍然希望我可以删除我在这里问的第一个问题(我不被允许)。我希望你会学习,随着时间的推移,你会发现快乐比痛苦多得多——我做到了。
    DateTimeFormatter timeFormatter
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
    String readTime = LocalTime.now(ZoneId.of("America/Dawson"))
            .format(timeFormatter);