如何在Android上解锁InputStream.read()?

taj*_*hal 7 java sockets android inputstream

我有一个线程,其中a的read()方法InputStream在循环中被调用.当没有更多字节要读取时,流将阻塞,直到新数据到达.

如果我呼吁close()InputStream从不同的线程,流被关闭,但被阻止的read()电话仍然受阻.我假设该read()方法现在应返回一个值,-1以指示流的结束,但它不会.相反,它会被阻塞几分钟,直到发生tcp超时.

如何取消阻止close()通话?

编辑:

显然,SocketException当阻塞read()调用对应的流或套接字是close()'d 时,常规JRE将立即抛出.但是,我使用的Android Java运行时不会.

任何有关Android环境解决方案的提示都将不胜感激.

Tal*_*han 4

read()当有可用数据时才调用。

做这样的事情:

    while( flagBlock )
    {
        if( stream.available() > 0 )
        {
            stream.read( byteArray );
        }
    }
Run Code Online (Sandbox Code Playgroud)

设置flagBlock停止读取。

  • available() 只会告诉您数据是否可用,而无需进行系统调用。当有数据要读取时,可以返回 0。 (4认同)
  • 您可以添加“sleep”作为 while 循环的最后一行。这将避免您忙于等待 (3认同)
  • 请注意,available() 的 Android 文档以警告“请注意,此方法提供的保证如此之弱,在实践中不是很有用”开头。 (3认同)