即使设置了超时参数,java HttpClient也会暂停很长时间
我有一个应用程序,可以从远程服务下载大量缩略图和其他资源
我使用的是DefaultHttpClient的一个实例和我编写的一个定制类,它安排了我所有的下载。所有下载都通过AsyncTask在后台线程上串行运行。在AsyncTask中执行onPostExecute之前,我不会重新运行下载例程
这通常非常有效。如果我把20张图片排成一列,我的调度程序就会做得很好。然而,我遇到了这样的情况:在调用客户机时,该过程只是暂停。执行(其中客户端是我的DefaultHttpClient实例)。我可以通过在应用程序中导航并执行随机操作(滚动列表、在活动之间来回导航等)来莫名其妙地恢复这个过程就好像我正在做的事情是向一个已暂停或死锁的线程发送“唤醒”消息
我在应用程序的所有移动部分添加了大量令人讨厌的日志记录,以查看此过程之外的内容是否导致某种死锁情况。我通过pid查看LogCat,以查看我的流程在暂停或恢复时是否发生了任何其他事情,我没有看到任何异常情况。最奇怪的是,我可以一次又一次地复制精确的条件
FWIW,我已经在传递给execute方法的HttpClient实例和HttpGet实例上设置了socket超时和连接超时。这不会导致execute方法提前返回或引发异常或诸如此类的情况。当程序“返回”时,HttpClient。execute返回一个有效的HttpResponse,一切正常
我可以调试一些东西来找出哪里出错了吗?我知道这是一个非常特殊的条件,但是一般来说,有没有高级方法专门调试Android中的DefaultHttpClient或http流量
谢谢
# 1 楼答案
我以前也有过类似的问题。 当我尝试在队列中执行HTTP get时,方法
httpClient.execute(get);
不会返回响应,比如死锁这是我的代码,我所做的是调用
entity.consumeContent();
,然后它就工作了# 2 楼答案
您是否跨线程共享同一个HttpClient?默认情况下它不是线程安全的,所以您可能需要检查一下。但很可能是I/O阻塞,所以应该进行一些连线调试。您可以使用类似的方法来启用HttpClient wire转储日志:
要启用它,请执行以下shell命令。导线日志将输出到logcat: