该代码在IDE上运行良好,但每当我将它实现到应用程序(用于Android)上时,它总是给我一个EOFException。
这是代码:
try {
URL url = new URL(link);
URLConnection con = url.openConnection();
BufferedReader bf = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb = new StringBuilder();
String inputLine;
while ((inputLine = bf.readLine()) != null) {
sb.append(inputLine);
}
bf.close();
} catch (Exception e) {
e.printStackTrace();
}这是堆栈跟踪
java.io.EOFException
W/System.err: at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:95)
W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:179)
W/System.err: at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628)
W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:409)
W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:353)
W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:220)
W/System.err: at com.example.unknown.api_testing.MainActivity$1.doInBackground(MainActivity.java:45)
W/System.err: at com.example.unknown.api_testing.MainActivity$1.doInBackground(MainActivity.java:35)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:292)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err: at java.lang.Thread.run(Thread.java:818)发布于 2016-08-02 02:20:24
这可能是由于您的设备上的连接。您是在运行WiFi还是3G连接?
您的设备可能正在丢失连接或丢弃一些数据包。为了确保连接运行良好,运行QOS测试可能是值得的。
查看一个应用程序,如:GB
您还可能希望检查连接是否正确地返回了END HTTP,并且没有在之后抛出错误。将每个inputLine输出到您的控制台,同时处理它以检查是否有异常。
如果引发异常,您还可能希望调整try catch块,以正确关闭读取器。对于catch块也要更加具体,例如: catch IOException而不是Exception,因为这将使您能够更干净地处理这些情况,因为您可能希望处理与其他Exceptions不同的IOExceptions。
try
{
URL url = new URL(link);
URLConnection con = url.openConnection();
BufferedReader bf = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb = new StringBuilder();
String inputLine;
while ((inputLine = bf.readLine()) != null)
{
sb.append(inputLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
//close your reader here
bf.close();
}发布于 2016-08-02 01:58:35
行后: URLConnection con = url.openConnection();
将这一行放在orger中,以避免收到gzip响应。
con.setRequestProperty("Accept-Encoding", "identity"); // no gziphttps://stackoverflow.com/questions/38710257
复制相似问题