0

我正在开发一个需要与服务器(在我的 PC 上运行)通信的 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 编程方面完全是初学者,所以我不知道为什么它这么慢。

4

2 回答 2

0

您一次读取 1 个字节。这是令人难以置信的低效。您想一次读取大量字节 - 尽可能多。这就是您的应用程序运行缓慢的原因。

于 2013-04-12T18:44:35.877 回答
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 可以为读取数据块而不是一次读取一个字节提供的优化。而且您并没有像目前那样分配那个巨型阵列。

于 2013-04-12T18:45:05.577 回答