【问题标题】:asynctask read blocking异步任务读阻塞
【发布时间】:2016-12-15 22:40:38
【问题描述】:
private byte[] sendCommand (byte[] command){
        try {
            nos.write(command);
            nos.flush();

            byte[] buffer = new byte[4096];
            int read;
            while ((read = nis.read(buffer, 0, 4096)) > 0 && isConnecting) {
                // Read the response
                temp_data = new byte[read];
                System.arraycopy(buffer, 0, temp_data, 0, read);
            }

我在 doInBackground() 中调用了 sendCommand 三次。 我希望在发送第一个命令后有 13 个字节的响应,然后在我的第二个命令中有一个字节,然后在我的第三个命令中大约 1kB。

问题 1:第一次调用 sendCommand() 会读取 13 个字节作为响应,但由于没有更多数据,读取会在 while 条件下阻塞。我怎样才能让它在不阻塞的情况下运行?

问题2:是否可以在一个线程中发送重复的写入和读取? 因为对于 sendCommand() 的第二次调用,我得到相同的 13 个字节而不是 1 个字节的响应。我想知道输出流是否没有正确发送命令。

【问题讨论】:

  • 我在你的读取循环中看不到任何会导致它退出的逻辑。这是您的实际代码,还是您已对其进行了编辑?
  • 这是我的实际代码。它在 read 为 -1 时退出。 read 在第一个 while 循环中为 13,当它第二次时,它会阻塞一段时间,然后以 -1 退出

标签: java multithreading sockets android-asynctask single-threaded


【解决方案1】:

您的读取被阻塞,因为您要求它检索 4k 字节。虽然它可能在读取所有请求的字节之前返回,但它会阻止这样做。您应该只尝试读取您期望的字节数:

byte[] response = new byte[expectedLen];
new DataInputStream(nis).readFully(response);
return response;

【讨论】:

    【解决方案2】:

    我不得不摆脱 while 循环,所以我只读了一次。我仍然不明白为什么它不会立即结束 while 循环,但同时删除循环仍然有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2011-05-07
      • 2019-01-24
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2018-04-06
      相关资源
      最近更新 更多