我写的一个简单的HTTP GET请求有一个小问题,它每隔X分钟请求一个URL。我每天都会遇到一两次这样的情况:进程在GET请求中途停止。
下面是一个调试日志的例子:
12-07 16:29:22.650 V/TAG(11655): Executing HTTP Request
12-07 16:29:25.336 D/dalvikvm(11655): GC_CONCURRENT freed 366K, 50% free 2824K/5639K, external 0K/0K, paused 3ms+3ms
12-07 16:29:25.526 D/dalvikvm(11655): GC_CONCURRENT freed 450K, 52% free 2825K/5767K, external 0K/0K, paused 2ms+2ms
12-07 16:29:29.990 I/ActivityManager( 1339): Process PackageName:remote (pid 11655) has died.
12-07 16:29:29.990 I/ActivityManager( 1339): Low Memory: No more background processes.
这给我带来了两个问题:
首先,我指定的超时不起作用:
HttpParams httpParameters = new BasicHttpParams(); int timeoutConnection = 10000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); int timeoutSocket = 10000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient client=new DefaultHttpClient(httpParameters); HttpGet request=new HttpGet(url); Log.v(TAG,"Executing HTTP Request"); HttpResponse response=client.execute(request);
第二个问题是,我看不出进程已经死亡的原因-如果它由于内存不足而被杀死,这个"死亡"消息是相同的吗?因为超时还没有到达(客户端)。
谢谢你的回复!
如果我没理解错的话,你是在问两件事:
- Q1:为什么指定的超时不起作用?
- Q2。这个过程为什么会消亡?
从Q2开始,我的猜测是你的进程被杀死了,因为超时不起作用,你的代码花了太长时间运行。结果,Android扼杀了它。
至于Q1:我做了一些实验,并注意到,在模拟器中,超时在我的应用程序中也不起作用。使用模拟器API7和API8进行测试,我总是在大约20秒后获得UnknownHostException
,而不管任何设置超时。这适用于DefaultHttpClient
以及HttpUrlConnection
和AndroidHttpClient
。
谷歌显示其他人也报告了超时问题:
- http://code.google.com/p/android/issues/detail?id=2409
- Android的Http连接超时不工作
- http连接超时问题
- 使用DefaultHTTPClient发出HTTPGet请求时Socket超时
没有一个建议的解决方案对我有效,所以我想唯一可靠的解决方案是自己管理超时。