Android通过HttpConnectionParams类为http参数设置提供了两个超时的设置选项,分别是setSoTimeout和setConnectionTimeout。初看一眼Android官方给的文档对这个两个方法的具体含义有一种不理解不够清楚的感觉,所以决定通过测试的方式来看看到底在什么情况下这两个参数会起作用。

经过测试可以发现,setConnectionTimeout设置了建立连接的超时,这是针对TCP的三次握手而言的,如果在指定时间内无法和http服务器建立TCP连接,就会抛出ConnectionTimeoutException。setSoTimeout则设置的是TCP保活时间,在建立了连接之后的指定时间内没有收到服务器发来的相应的数据包,则抛出SocketTimeoutException.

一、测试代码

 
        private String urlString;
private int timeout1,timeout2;
MyAsyncTask(String url,int timeout1,int timeout2){
urlString=url;
this.timeout1=timeout1;
this.timeout2=timeout2;
}
@Override
protected String doInBackground(String... params) {
httpget(urlString,timeout1,timeout2);
return "test";
} protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyAsyncTask("http://www.xiaonei.com:1234",3000,5000).execute("start");
new MyAsyncTask("http://www.baidu.com",3000,5000).execute("start");
} private void httpget(String Url,int timeout1,int timeout2) { Log.v("httpget", "httpget start timeout1 is "+timeout1+"timeout2 is "+timeout2);
int timeoutConnection = timeout1; // until connection is established
int timeoutSocket = timeout2; // timeout for waiting for data
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,
timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpGet postRequest = new HttpGet(Url); HttpResponse httpResp = null; try {
httpResp = httpClient.execute(postRequest);
} catch (ClientProtocolException e) {
Log.v("Main", "clinet protocol exception");
return;
}catch (SocketTimeoutException e) {
// TODO: handle exception
Log.v("Main", "socket timeout"+timeout2);
return;
}catch (ConnectTimeoutException e) {
// TODO: handle exception
Log.v("Main", "connection timeout"+timeout1);
return;
}
catch (IOException e) {
Log.v("Main", "io exception");
return;
} }

二、setConnectionTimeout测试

在httpget的url中写入一个无法进行通信的地址如“10.1.1.1”或者是一个公开服务器没有开放的端口号如“www.xiaonei.com:1234”都会出现ConnnectionTimeoutException.对于一个无法通信的IP地址,Android系统直接构造一个发送至改地址的TCP建立连接数据包,不过由于该地址不存在,所以不会收到确认,到了设定好的超时时间就发生超时事件。对于不存在端口号的情况基本类似。

三、setSoTimeout测试

setSoTimeout设置了socket的保活超时时间。这里的测试方法是通过给Android终端设置代理,在代理收到了Android终端发来的http请求之后,直接截获http请求不予发送,到了超时时间抛出socketTimeoutException.这样一种http数据包截获的方式可以通过fiddler方便地实现。利用fiddler代理功能进行Androidhttp抓包配置方法见http://www.oschina.net/question/221817_129716,fiddler拦截数据包的方法见http://www.mzwu.com/article.asp?id=3509

配置了fiddler代理并对http包进行拦截之后,运行测试程序可以得到如下输出。两个http请求都输出了socket timeout。第一个请求之所以也输出了socket timeout,是因为Android终端和代理之间能够正常建立连接,所以不会出现connection timeout,但是代理转交了Android终端发来的http请求之后无法获得响应,也就无法将相应的信息反馈给客户端,客户端出现了socket timeout。

四、AsyncTask的进一步理解

从以上测试结果中可以看出,虽然在oncreate函数中同时调用了AsyncTask类分别发送两个不同的http请求,但是第二个被调用的Asyntask需要等到第一个被调用的超时之后才能被执行。这是因为Android在3.0之后,AsyncTask的实现上将所有的Asynctask都放到了一个线程中,按照一定的顺序有先后的执行。更详细的分析可以参考http://blog.csdn.net/singwhatiwanna/article/details/17596225

五、参考材料

[1]关于http超时参数的解释:http://stackoverflow.com/a/18185568/1767800

[2]关于如何得到http连接超时:http://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-error

Android http超时选项的测试的更多相关文章

  1. Android自动化测试基础知识——MONKEY测试工具(转的)

    本周开始启动手机输入法simeiji的自动化测试,同时开始接触手机浏览器自动化测试.接下来会对android自动化测试工具和方法做一个专题研究. 第一篇介绍monkey测试工具. 1 自动化测试背景 ...

  2. Android Testing学习01 介绍 测试测什么 测试的类型

    Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...

  3. Android弹出选项框及指示箭头动画选择

     Android弹出选项框及指示箭头动画选择 Android原生的Spinner提供了下拉列表选项框,但在一些流行的APP中,原生的Spinner似乎不太受待见,而通常会有下图所示的下拉列表选项框 ...

  4. Android中的单位及测试相关概念

    android中的单位: in 英寸 pt 点距 px 像素  dp(dip) 密度无关的像素单位,自适应device屏幕的比例,通常涉及长宽高时采用 sp 与范围无关的像素单位,通常在设置字体大小时 ...

  5. [原]CentOS7安装Rancher2.1并部署kubernetes (三)---解决登录kubernets超时和部署测试Pod和Containter[nginx为例]

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  6. 开启Android应用调试选项的工具XDebug的介绍

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/81187769 最近这段时间比较郁闷,就不分享和学习比较复杂的Android逆向技 ...

  7. 转:Android preference首选项框架

    详解Android首选项框架ListPreference 探索首选项框架 在 深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用 ...

  8. android应用程序monkey压力测试(模拟器或真机)

    首先需要安装一个模拟器: 前置条件: 1.jdk环境配置 2.eclipse下载安装(直接解压即可) 3.网站上下载ADT: 由于国内禁止google的浏览,所以需要自己上网找资源,下面这个网站有比较 ...

  9. Android APP性能及专项测试

    移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android的a ...

随机推荐

  1. 5个强大的Java分布式缓存框架推荐

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的 缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了 ...

  2. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  3. Android 获取图片exif信息

    使用android api读取图片的exif信息 布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  4. 【原】iOS容易造成循环引用的三种场景,就在你我身边!

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...

  5. 搭建Maven私服-续

    前几天搭建了Maven私服,但是想在外网访问只能通过ip地址,因为公司用的不是固定ip所以,ip地址每次不一样,都要先打开极路由查看一下当前ip才能用,更恶心的是,代码check out只能一次,下次 ...

  6. iOS集成ijkplayer视频直播框架,遇到的bug和坑...

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #555555 } p. ...

  7. php中的cookie用法

    cookie和session都可以暂时保存在多个页面中使用的变量,但是它们有本质的差别. cookie存放在客户端浏览器中,session保存在服务器上.它们之间的联系是session ID一般保存在 ...

  8. 这个错误,每个ScrumMaster都犯过

    [小编]ScrumMaster要授之以渔,还是授之以鱼?从04年开始接触XP,到08年自己的团队开始提出敏捷的概念,再到10年接受ScrumMaster培训:在刚开始做ScrumMaster的一段时间 ...

  9. js中的==运算: [''] == false —>true

    图1 计算下面表达式的值: [''] == false 首先,两个操作数分别是对象类型.布尔类型.根据图1,需要将布尔类型转为数字类型,而false转为数字的结果是0,所以表达式变为: [''] == ...

  10. mac版 android破解软件下载安装

    1 apktool下载安装 下载地址https://code.google.com/p/android-apktool/ [1].下载apktool.jar — 解压 [2].下载Mac上的辅助工具a ...