Android HttpClient出现org.apache.http.conn.ConnectTimeoutException,导致下载不成功如何解决
在Android 4.0环境下,应用使用HttpClient向服务请求xml数据或者请求图片下载,出现下列异常(请求xml数据部分代码没有给出)
W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856) I/CategoryActivity( 2770): action:IMG_DOWNLOAD_COMPLETE D/DetailActivity( 2770): ####zhoulc has getMessage,action:IMG_DOWNLOAD_COMPLETE W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856) W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856) D/skia ( 2770): --- decoder->decode returned false W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856) W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856) W/System.err( 2770): org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238) W/System.err( 2770): at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:177) W/System.err( 2770): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:326) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) W/System.err( 2770): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.downFile(DownLoadToolUtil.java:108) W/System.err( 2770): at com.ipanel.market.request.DownLoadToolUtil.run(DownLoadToolUtil.java:64) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err( 2770): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err( 2770): at java.lang.Thread.run(Thread.java:856)
具体下载部分代码如下:
public int downFile(String fileName, String url, long curfilelength) { InputStream input = null; RandomAccessFile file = null; int readSize = -1; byte[] buffer = new byte[8024]; Log.d(TAG, "downFile url = " + url); Log.d(TAG, "downFile fileName = " + url); Log.d(TAG, "downFile curfilelength = " + curfilelength); try { if (curfilelength != 0) { url = FilePath.GET_INTERRUPT_APK + "?url=" + url + "&fileSize=" + curfilelength; Log.d(TAG, "after change" + url); } HttpGet request = new HttpGet(); // request.addHeader("Range", "bytes=" + curfilelength + "-"); request.setURI(new URI(url)); HttpResponse response = client.execute(request); file = new RandomAccessFile(fileName, "rw"); file.seek(curfilelength); input = response.getEntity().getContent(); while ((readSize = input.read(buffer)) != -1) { file.write(buffer, 0, readSize); } return DownLoadCallBack.DOWNLOAD_SUCCESS; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return DownLoadCallBack.DOWNLOAD_FAILD; } finally { if (input != null) { try { input.close(); input = null; } catch (Exception e2) { // TODO: handle exception } } if (file != null) { try { file.close(); file = null; } catch (Exception e2) { // TODO: handle exception } } } }
HttpClient也设置了超时情况:
//设置连接管理器的超时 ConnManagerParams.setTimeout(params, 1000); //设置连接超时 HttpConnectionParams.setConnectionTimeout(params, 5000); //设置socket超时 HttpConnectionParams.setSoTimeout(params, 10000);
请问,这个异常是一定会抛的吗,导致图片没有下载成功,我需要在处理异常的时候再次进行下载,还是代码哪有缺陷,需要改正。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
把连接超时的时间调大些.比如设置成60000毫秒.
回复
我不知道你怎么想的,要是有上万链接,岂不是很不效率了?
请问这个问题,您怎么解决的?我今天也遇到了。一开始访问是ok的,偶尔会出现这个异常。。。
问题解决了,在做耗时较长的http请求交互的时候,重新new一个httpClient对象,而不是用一个单例的httpclient对象进行管理,所有的http请求。
ConnManagerParams.setTimeout这个是连接最大等待时间,HttpConnectionParams.setConnectionTimeout这个是最大连接超时时间,HttpConnectionParams.setSoTimeout这个是读取超时时间,根据org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection,可以知道是在ConnManagerParams.setTimeout(params, 1000);这句抛出的,把1000改成10000吧。
sorry,多测试几次之后,还是出现了这个问题。
ConnManagerParams.setTimeout这个是连接最大等待时间,HttpConnectionParams.setConnectionTimeout这个是最大连接超时时间,HttpConnectionParams.setSoTimeout这个是读取超时时间,根据org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection,可以知道是在ConnManagerParams.setTimeout(params, 1000);这句抛出的,把1000改成10000吧。
引用来自“zhoulc”的答案
问题解决了,在做耗时较长的http请求交互的时候,重新new一个httpClient对象,而不是用一个单例的httpclient对象进行管理,所有的http请求。