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

时间:2018-12-13 16:00:24

标签: java android arrays while-loop buffer

在下面的while循环中,我发现输出有些奇怪的行为。我已经花了几个小时仔细研究了一下,但是对于为什么它返回原来的方式我感到困惑。

 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为true,则if块中的代码将循环21次。 如果firstbyte == -91为true,则if块中的代码循环24次。 在Arrays.copyOfRange()的第二个参数中,它确切地循环了多少次,这似乎不是巧合,但是第二个参数应该指定位置我要包括在数组中的最后一个字节吗?

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

1 个答案:

答案 0 :(得分:0)

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

正如您在评论中提到的那样,设备正在以一种意想不到的方式发送数据-即,长度不断增加的数据块始终始终位于byte1(90或-91)的前面。由于与BT链接的速度相比,您的循环运行更快,因此它总是总是最先读取byte1。我希望mmInStream.read()返回1,然后2,然后3,依此类推,进行21或24次迭代,直到发送完整的有效数据包为止。这就解释了您看到的行为。

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