java.io.IOException:BufferedInputStream在Android 2.3中关闭

ser*_*rgi 5 android http bufferedreader

以下代码在Android 1.5-2.2.1中运行良好,但它不在2.3及更高版本中.

BufferedReader rd;
rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

StringBuffer sb = new StringBuffer();
String line;
while ((line = rd.readLine()) != null){
    sb.append(line);
}
rd.close();
Run Code Online (Sandbox Code Playgroud)

stracktrace:

01-30 08:21:42.668: WARN/System.err(594): java.io.IOException: BufferedInputStream is closed
01-30 08:21:42.668: WARN/System.err(594):     at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:116)
01-30 08:21:42.728: WARN/System.err(594):     at java.io.BufferedInputStream.read(BufferedInputStream.java:274)
01-30 08:21:42.728: WARN/System.err(594):     at org.apache.harmony.luni.internal.net.www.protocol.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:40)
01-30 08:21:42.758: WARN/System.err(594):     at java.io.InputStreamReader.read(InputStreamReader.java:255)
01-30 08:21:42.758: WARN/System.err(594):     at java.io.BufferedReader.fillBuf(BufferedReader.java:128)
01-30 08:21:42.758: WARN/System.err(594):     at java.io.BufferedReader.readLine(BufferedReader.java:357)
Run Code Online (Sandbox Code Playgroud)

这是一个问题吗?2.3中有什么变化吗?

bum*_*way 9

我也注意到了这一点.您可以做的一件事是在循环结束时检查BufferedReader的状态:

while((line = rd.readLine()) != null){
    sb.append(line);
    if (!rd.ready()) {
       break;
    }
}
rd.close();
Run Code Online (Sandbox Code Playgroud)

但是,ready()不保证您的流最后.它仅检查流是否被阻止或关闭.请参阅developer.android.com上的BufferedReader.ready()

我认为这是Android OS 2.3及更高版本中引入的错误.请在官方安卓网站上为bug基础做出贡献,以鼓励谷歌解决这个问题.不幸的是,已经有许多设备已经附带OS版本2.3到2.3.3.

您的情况是,您可能在一次读取中命中文件的末尾,并且流自动关闭.我认为这是Android 2.3及更高版本中引入的错误.

glassonion的帖子可行,但该解决方法对长数据流的执行速度非常慢.

由于移动应用程序可能随时丢失互联网连接,因此您正在读取的InputStream可能只是被阻止并等待更多数据.

更合适的方法可能是在新线程上打开套接字,读取数据并等待超时以对冲连接中的任何缓慢.

以下文章很好地解释了处理停滞连接的问题.阅读摘要应足以说服你.

所有好的网络应用程序都将包括超时检测和处理.无论您是在编写客户端,还是需要检测任意服务器,或者编写服务器并且需要防止连接失效,超时处理都是错误处理的关键部分.

  • 对于其他人,请点击此页面底部的星标链接http://code.google.com/p/android/issues/detail?id=14562,以帮助Google优先处理此错误修正. (2认同)