从Android / Java中的连接线程读取double

时间:2013-01-27 22:27:41

标签: java android bluetooth double

我目前正在使用GitGub上的开发人员jjoe64中的GraphView,我想知道如何将我在BT连接的线程类中创建的double检索到GraphView类。这是调用随机数据的原始函数,但我想从BlueTooth类中获取串行数据 此实时图表中的当前函数是:

private double getRandom() {
    double high = 3;
    double low = 0.5;
    return Math.random() * (high - low) + low;
}

在我的蓝牙课程中,我有ConnectedThread.read()命令,但它并没有真正起作用。这是:

public static double read() {
    try {
        byte[] buffer = new byte[1024];
        double bytes = mmInStream.read(buffer);
        return bytes;
    } catch(IOException e) {
        return 5;
    }
}

我不确定我的手机是不是太慢了,它运行的是Android2.3(DesireHD),但我学校的教授说如果我打电话给ConnectedThread.read()它并且它等于它就应该可以正常工作一个double。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你没有提供足够的信息来开箱即用的解决方案,但无论如何我都会试一试。

首先,我假设mmInStreamInputStream或其子类。查看int InputStream.read(byte[] b)的API:

  

从输入流中读取一些字节数并将它们存储到缓冲区数组b中。实际读取的字节数以整数形式返回。此方法将阻塞,直到输入数据可用,检测到文件结尾或抛出异常。

这意味着您从read()方法返回的内容只是从buffer写入mmInStream的字节数。这可能不是你想要做的。您可能想要做的是从此流中只读取。要做到这一点,你应该:

  • 在创建mmInStream之后将DataInputStream包裹在mmInStream中:

    mmInStream = yourMethodCreatingInputStream();
    dataInStream = new DataInputStream(mmInStream);
    
  • double读取dataInStream值。但是,与所有计算机系统一样,您必须了解输入值的确切格式。您必须参考用于获取输入数据的设备规范。

现在dataInStream派上用场了,因为它抽象了必要的低级IO操作,让您专注于数据。它会自动将您对数据的查询转换为IO操作。例如:

  • 如果您的数据采用double格式(我相信您的教授的话就是这种情况),那么您的read()方法就像以下一样简单:

    public static double read() {
        return dataInStream.readDouble();
    }
    
  • 如果数据以float格式出现:

    public static double read() {
        return (double)dataInStream.readFloat();
    }
    

但同样,请务必查阅您所使用的设备的规格以获取确切的格式。有些设备可能会以异常格式传递数据,例如:“前2个字节是结果值的整数部分,后2个字节是小数部分”。作为数据的消费者,您可以遵循其格式。