Android的InputStream.read()异常缓慢(Android InputStream

2019-10-29 07:03发布

我工作的一个Android应用程序,需要有这也是我写的服务器(在我的电脑上运行)进行通信。 的问题是,InputStream.read()接受一个永恒,处理200KB需要大约30秒的东西。 也许垃圾收集以某种方式参与其中,我的循环过程中它被称为不时但上市延迟只有2或3个millisecods和所有的一切,也许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中的编程总初学者,所以我不知道为什么它是那该死的缓慢。

Answer 1:

你为什么要单独读取每个字节? 它看起来像你真的想读的前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可以提供一次读取数据块,而不是一个字节的优化。 而你是不是在分配这些大型阵列喜欢你目前有。



Answer 2:

你每次读1个字节。 这是令人难以置信的效率低下。 你想在onc​​e-尽可能多地阅读了大量的字节。 这是您的应用程序速度慢的原因。



文章来源: Android InputStream.read() horribly slow