asynctask读取阻塞

时间:2016-12-15 22:40:39

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

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字节的响应。我想知道输出流是否没有正确发送命令。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我不得不摆脱while循环,所以我只读了一次。我仍然不明白为什么它不会立即结束while循环,但删除循环的工作时间也是如此。