2011-01-30 32 views
5

Mã sau đây hoạt động tốt trong Android 1.5-2.2.1 nhưng không phải trong 2.3 trở lên.java.io.IOException: BufferedInputStream bị đóng trong Android 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(); 

Các 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) 

Đây có phải là một vấn đề? Có bất cứ điều gì thay đổi trong 2,3 ??

+0

Câu lệnh nào trong mã của bạn đang ném IOException? – TheCottonSilk

+0

Điều này: trong khi ((line = rd.readLine())! = Null) – sergi

Trả lời

9

Tôi cũng nhận thấy điều này. Một điều bạn có thể làm là kiểm tra trạng thái của BufferedReader ở phần cuối của vòng lặp của bạn:

while((line = rd.readLine()) != null){ 
    sb.append(line); 
    if (!rd.ready()) { 
     break; 
    } 
} 
rd.close(); 

Tuy nhiên, sẵn sàng() không đảm bảo rằng luồng của mình là lúc kết thúc. Nó chỉ kiểm tra xem luồng có bị chặn hay không. Xem BufferedReader.ready() on developer.android.com

Tôi nghĩ đây là lỗi được giới thiệu trong Android OS 2.3 trở lên. Vui lòng đóng góp vào cơ sở lỗi trên trang web chính thức của android để khuyến khích Google khắc phục sự cố này. Thật không may, đã có nhiều thiết bị đã được vận chuyển với các phiên bản hệ điều hành 2.3 đến 2.3.3.

Tình huống của bạn là bạn có thể đã nhấn vào cuối tệp trong một lần đọc và luồng được tự động đóng. Tôi nghĩ rằng đó là một lỗi được giới thiệu trong Android 2.3 trở lên.

bài đăng của glassonion sẽ hoạt động, nhưng cách giải quyết đó sẽ thực hiện rất chậm trên các luồng dữ liệu dài.

Vì ứng dụng dành cho thiết bị di động có thể mất kết nối internet bất cứ lúc nào, InputStream bạn đang đọc có thể chỉ bị chặn và chờ thêm dữ liệu.

Cách tiếp cận thích hợp hơn có thể là mở một ổ cắm trên một sợi mới, đọc dữ liệu và chờ với thời gian chờ để phòng hộ trước bất kỳ sự chậm trễ nào trong kết nối của bạn.

The following article giải thích việc xử lý các kết nối bị ngừng hoạt động khá tốt. Đọc tóm tắt là đủ để thuyết phục bạn.

Tất cả các ứng dụng mạng tốt sẽ bao gồm phát hiện và xử lý thời gian chờ. Cho dù bạn đang viết một máy khách, và cần phát hiện một máy chủ hướng tới, hoặc viết một máy chủ và cần phải ngăn chặn các kết nối bị trì hoãn, xử lý thời gian chờ là một phần quan trọng của việc xử lý lỗi.

+1

Cảm ơn sự giúp đỡ. Tôi đã vào đây như một con bọ. http://code.google.com/p/android/issues/detail?id=14562 – sergi

+0

@sergi Bạn được chào đón! glassonion và tôi làm việc cùng nhau và đóng vai chính lỗi. Nếu bạn nhận được bất kỳ phản hồi nào từ Google, vui lòng cho chúng tôi biết. (và ngược lại) – bumbobway

+2

Đối với những người khác, vui lòng nhấp vào liên kết dấu sao ở cuối trang này http://code.google.com/p/android/issues/detail?id=14562 để giúp Google ưu tiên lỗi này . – bumbobway

2

cách giải quyết bên dưới.

InputStreamReader sr; 
sr = new InputStreamReader(connection.getInputStream(), "UTF-8"); 
StringBuilder builder = new StringBuilder(); 
for (int bt = 0; (bt = sr.read()) != -1;) { 
    builder.append((char)bt); 
} 
sr.close(); 
Các vấn đề liên quan