【问题标题】:Thread.Sleep crashes my appThread.Sleep 使我的应用程序崩溃
【发布时间】:2014-01-24 15:11:09
【问题描述】:

此应用通过 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 循环并添加 thread.sleep 但它冻结了应用程序并崩溃......什么给了?有没有其他方法可以控制命令发送的速度?我宁愿尽快发送它们,但恐怕我不太了解 Java。到目前为止,这一直是我完成这个个人项目的主要垫脚石,被困了 2 天来研究和尝试解决方案。

【问题讨论】:

  • 如果问题可以通过暂停输出来解决,那么您只需将工作放在后台线程中。您在onClick 中所做的所有耗时过长的操作都会“冻结”应用程序。
  • 请发布您的相关日志条目。

标签: java android arrays multithreading serialization


【解决方案1】:

看起来您正在休眠约 1000 毫秒(准确地说是 950 毫秒,因为您的最后一个操作没有发送到串行设备)加上通过串行连接执行写入所需的时间。很长一段时间什么都不做。去掉Thread.sleep(50)调用,把onClick的全部内容放到如下代码的run方法中:

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

然后,就快速写入导致连接崩溃的问题提出不同的问题。

【讨论】:

  • 这解决了我的问题,因为 gui 没有冻结。它仍然使应用程序崩溃。我使用了 thread.sleep,只要我将它保持在 350 并且不低于它就会“正常”运行,但我觉得你正在引导我找到一个更好的解决方案。我一直在阅读 ftdi 串行芯片的 api 文档,但我没有看到如何在不丢失数据的情况下控制芯片上的 i/o ...也许接下来会进行更多阅读,除非有人能更好地告诉我...谢谢大卫...
  • @Nandy 我带你去问一个关于你的 ftdi 串行芯片的 IO 的单独问题。您在这里提出了两个问题,我选择先回答简单的问题。如果它解决了最初的问题,您应该接受这个答案,然后通过“”跟进另一个问题,因为现在情况不同了(应用程序不会由于 UI 冻结而崩溃,而是由于您的串行通信而崩溃)。然后人们可以更轻松、更直接地帮助您解决该问题。而且,是的,我认为你的未来会有一些阅读(=
  • @Nandy 还注意到您只向设备发送了 20 个命令中的 19 个。
  • 第一次成功运行命令后,我意识到自己的错误。我将很快在另一个线程中发布我的 I/O 问题。感谢您的帮助。
猜你喜欢
  • 2017-08-21
  • 1970-01-01
  • 2017-04-07
  • 2011-05-26
  • 2013-08-20
  • 2021-08-28
  • 2012-05-09
  • 2010-11-08
  • 1970-01-01
相关资源
最近更新 更多