繁体   English   中英

Android InputStream.read()非常慢

[英]Android InputStream.read() horribly slow

我正在开发需要与服务器(在我的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编程的初学者,所以我不知道为什么这么慢。

您一次读取一个字节。 效率极低。 您希望一次读取大量字节-尽可能多。 这就是您的应用程序运行缓慢的原因。

为什么要逐个读取每个字节? 看来您确实想读取前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可以提供的用于读取数据块的优化,而不是一次读取一个字节。 而且您没有像现在那样分配该大型数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM