Java 逻辑 - while 循环中发生的奇怪事情

Java logic - strange things happening in while loop

在下面的 while 循环中,我发现输出有一些奇怪的行为。我花了几个小时查看它,但我很困惑为什么它 returns 它的方式。

 while (true) {

            try {

                Log.d("DEBUG BT - BT Service", "IN CONNECTED THREAD RUN");
                  for(byte firstbyte : buffer){
                  int j = 0;
                  int nbytes = mmInStream.read(buffer);            //read bytes from input buffer
                  //    int nbytes = mmInStream.available();
                       String readMessage = new String(buffer, 0, nbytes, "ISO-8859-1");
                  firstbyte = buffer[j];
                      byte[] adjbuff;
                  if(firstbyte == 90){

                      adjbuff = Arrays.copyOfRange(buffer, 0, 21);
                   Log.i("Buffer conditioning", "Solenoid syncbyte ran from Connectedthread");
                      mHandler.obtainMessage(MESSAGE_READ, 22, -1, adjbuff).sendToTarget();


                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      Log.i("data incoming loop", "Break at if");
                      break;
                  }else if(firstbyte == -91){
                      adjbuff = Arrays.copyOfRange(buffer, 0, 24);
                      Log.i("Buffer conditioning", "Sensor syncbyte ran from Connectedthread");
                      mHandler.obtainMessage(MESSAGE_READ, 25, -1, adjbuff).sendToTarget();
                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      Log.i("data incoming loop", "Break at if");
                      break;

如果 firstbyte == 90 为真,则 if 块中的代码将循环 21 次。 如果 firstbyte == -91 为真,那么 if 块中的代码将循环 24 次。 它在 Arrays.copyOfRange() 的第二个参数中精确循环的次数似乎不是巧合,但第二个参数应该指定我要包含在数组中的最后一个字节的位置?

有人知道为什么会这样吗?我没有办法解决这个问题。

在这种情况下,我们无法了解循环的整个行为,b/c 这取决于您的 BT 设备(我们无权访问)的动态行为。设备发送的数据可以说是预测循环功能的最重要因素。

正如您在评论中提到的,设备正在以一种意想不到的方式发送数据——也就是说,数据块的长度不断增加,前面总是带有 byte1(90 或 -91)。因为与 BT link 的速度相比,您的循环运行得很快,所以它可能总是先读取 byte1。我希望 mmInStream.read() returns 1,然后 2,然后 3,依此类推,进行 21 或 24 次迭代,直到发送完整的有效数据包。这解释了您看到的行为。

换句话说,循环完全按照您的指示执行,但设备执行了意想不到的操作。而且,一旦您能够解决该问题,您就发现了您的问题。