Thread.Sleep崩溃我的应用程序

时间:2014-01-07 02:52:12

标签: java android arrays multithreading serialization

此应用程序通过usb到串行加密狗与串行设备进行通信。我已经能够让它处理我的单个查询没有问题,但我有一个命令,将向串行设备发送多个查询,在我看来缓冲区如果得到溢出。这是我的代码的一部分:

这是我的数组,包含20个查询命令:

   String [] stringOneArray = {":000101017d", ":0001060178", ":00010B016C", ":000110017D",
        ":0001150178", ":00011A016C", ":00011F0167", ":0001240178", ":0001290173",
        ":00012E0167", ":0001330178", ":0001380173", ":00013D0167", ":0001420178",
        ":0001470173", ":00014C0167", ":0001510178", ":0001560173", ":00015B0167", ":0001600178"};

这就是我使用数组的方式:

getVelocitiesButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        ftDev.setLatencyTimer((byte) 16);
        int z;
        for (z = 0; z < 19; z++) {
            String writeData = (String) stringOneArray[z];
            byte[] OutData = writeData.getBytes();
            ftDev.write(OutData, writeData.length());
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) { }
        }
    }
});

不确定其余代码是否必要,但会在需要时添加。 所以ftdev是我的串口设备。它将查询命令发送到串行设备,它接收以字节为单位的响应,我使用For循环来构建响应,直到所有字节(每个响应31个字节)然后我处理该响应,那时它应该接收第二个查询来自数组的命令,依此类推,直到最后一个命令被发送。如果我允许FOR循环只发送一个或两个查询但是数组索引数量较多而且崩溃,那么花花公子就可以了。想象我只是放慢FOR循环并添加thread.sleep但它会冻结应用程序并崩溃......是什么给出的?有没有其他方法来控制命令发送的速度?我宁愿尽快发送它们,但恐怕我不太了解java。到目前为止,这是我完成这个个人项目的主要踏脚石,经过2天的研究和尝试解决方案。

1 个答案:

答案 0 :(得分:1)

看起来你已经睡了大约1000毫秒(确切地说是950,因为你的上一次操作没有发送到串行设备)加上通过串行连接执行写操作所需的时间。这是一个很长时间无所事事的时间。删除Thread.sleep(50)调用并将onClick的全部内容放入以下代码的run方法中:

AsyncTask.execute(new Runnable {
    @Override
    public void run() {
        // talk to device here
    }
});

然后,问一个关于快速写入会破坏连接的另一个问题。