上传文件时在NetHttpRequest.execute()期间抛出“意外的流结束”

时间:2013-07-31 06:07:20

标签: android network-programming

有几个问题已经提出这个问题,但我还没有看到真正的答案。我有Android代码执行NetHttpRequest来将图像POST到服务器,但它经常会很快失败:

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库过早关闭连接有关,但我无法确定原因。大多数相关问题都有完全相同的问题(例如Uploading jpeg to Google Drive from Android app "unexpected end of stream",)除了在每种情况下问题都没有得到答复或者提问者找到一些似乎为他们解决的奇怪的解决方法(尽管他们可能只是幸运)

我的上传代码也不是什么特别的,只是一个创建HttpRequest并执行它的AsyncTask。它在大多数情况下都能很好地工作,但有时却会莫名其妙地失败。是什么给了什么?

1 个答案:

答案 0 :(得分:1)

好的,我想出来了。

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

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

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

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