Android InputStream.read()非常慢

时间:2013-04-12 18:29:34

标签: java android networking client inputstream

我正在开发一款需要与服务器(在我的电脑上运行)通信的Android应用程序,这也是我编写的。 问题是InputStream.read()需要一个永恒,处理200kb需要大约30秒。也许垃圾收集以某种方式涉及,在我的循环中它不时被调用,但列出的延迟只有2或3毫秒,总共可能是20毫秒所以我不认为这是问题。

我的代码:

client = new Socket("192.168.1.1", 1235);
client.setTcpNoDelay(true);
client.setReceiveBufferSize(1048576);
InputStream is = client.getInputStream();

byte[] buffer = new byte[1048576];
int i = 0;
int length = -1;

while (true)
{
    int b = is.read();
    if (b == -1)
    {
        success = false;
        break;
    }
    buffer[i] = (byte) b;

    if (i == length)
        break;

    if (i == 3)
    {
        length = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
    }

    i++;
}

我在Java方面并不是很有经验,也不是Android编程的初学者,所以我不知道为什么会这么慢。

2 个答案:

答案 0 :(得分:0)

您一次只读取1个字节。这非常低效。你想尽可能多地一次读取大量字节。这就是你的应用程序运行缓慢的原因。

答案 1 :(得分:0)

为什么要单独读取每个字节?看起来你真的想要读取前3个字节并找出你的长度然后读取那个块。

IE:

final byte[] lengthBuffer = new byte[3];

int b = is.read(lengthBuffer);

// make sure b was 3 and do your length calculation

final byte buffer = new byte[length];

b = is.read(buffer);

// check b and then you have your bytes

然后,您至少可以获得Inputstream可以提供的优化,以便一次读取数据块而不是一个字节。你并没有像现在这样分配那个巨型阵列。