【发布时间】:2011-11-01 12:22:55
【问题描述】:
我正在开发一个需要使用 HttpClient 才能将文件从 Android 设备上传到 Web 服务器的 Android 应用程序。我上传的文件最大可以达到 1 Gb,因此如果设备在上传过程中断开连接,可能会发生超时。奇怪的是,我为套接字设置的超时似乎没有任何效果。每当我失去连接而不是引发 SocketTimeoutException 时,应用程序就会挂起。
我尝试使用:
HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT);
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT);
但这仅适用于连接超时,不适用于套接字超时。我也试过了:
HttpParams p = httpclient.getParams();
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
我知道连接超时有效的原因是,执行后我会收到连接超时异常
httpclient.execute(httppost);
在上传过程中连接丢失时,应用程序似乎挂起,但在应用程序成功连接到服务器之后。
为了测试我的应用,我在不同时间禁用了网络以查看应用的反应。如果我在发送请求之前禁用网络,我会收到连接错误,我的应用程序可以正常处理它,但如果我在上传期间禁用它,应用程序会挂起。当然,我是通过 AsyncTasks 执行所有这些请求,因此主 UI 线程不会崩溃。我只是想知道是否有任何其他方法可以确保套接字在未收到任何数据时超时,或者我是否在这里遗漏了任何内容。我已经阅读了很多博客和帖子,但其中大多数只是建议使用对我不起作用的 SO_TIMEOUT。
sotimeout not working in a multipart http post on android 2.1
【问题讨论】:
-
您的应用是否使用过较小的文件?
-
我已经尝试了 1 mb 的文件,但错误仍然存在。我猜对于较小的文件,您在文件上传之间更有可能断开连接,但这不是重点。我希望能够在发生网络故障时使我的应用程序健壮。
-
我遇到了同样的问题,除了我的上传大小相当小,大约只有几 kb。似乎触发该错误所需的只是让网络在我检查它是否启动之后但在我调用 execute() 之前关闭。
标签: java android sockets timeout httpclient