0

这已在几个问题中提出,但我还没有看到真正的答案。我有执行 NetHttpRequest 以将图像发布到服务器的 Android 代码,但它通常会很快失败,如下所示:

unexpected end of stream java.io.IOException: unexpected end of stream
    at libcore.net.http.FixedLengthOutputStream.close(FixedLengthOutputStream.java:58)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:84)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1009)
    at com.test.MyActivity$ImageUploadTask.doInBackground(MyActivity.java:870)
    at com.test.MyActivity$ImageUploadTask.doInBackground(MyActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)

我不明白...为什么会这样失败?鉴于回溯,它让我相信它一定与 HTTP 库过早关闭连接有关,但我无法确定原因。大多数相关问题都有完全相同的问题(例如,从 Android 应用程序“意外结束流”将 jpeg 上传到 Google 云端硬盘),除非在每种情况下问题都没有得到解答,或者提问者发现了一些似乎可以为他们解决问题的奇怪解决方法(尽管他们很可能只是走运)。

我的上传代码也没有什么特别之处,只是一个创建 HttpRequest 并执行它的 AsyncTask。它在大多数情况下都可以正常工作,但其他时候却莫名其妙地失败了。是什么赋予了?

4

1 回答 1

1

好的,我想通了。

经过更多调试后,我能够消除很多变量,并说服自己这个错误必须存在于核心 HTTP 库中。一些谷歌搜索发现一些人在 Android 的 HTTP 保持活动实现中引用了错误(https://code.google.com/p/googleappengine/issues/detail?id=9291,Galaxy Nexus 上的Weird EOFException等)。

所以我将此代码添加到我的活动中:

System.setProperty("http.keepAlive", "false");

这解决了我的问题。烦人的解决方法,但它有效。

于 2013-08-01T01:30:18.673 回答