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. linux集群运维工具:clustershell和pssh

    由于需要安装hadoop集群,有10台机器需要安装,一开始打算用SCP复制,后来觉得不可接受(实际现场可能数倍的机器集群,就是10台也不想干).后来在网上找了,发现了clustershell和pssh ...

  2. 你真的了解UIViewController生命周期吗?

    一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现 ...

  3. objective-c系列-@Property&点语法

    //解释 property后边的圆括号中的修饰词的含义: //          nonatomic  非线程安全  非原子操作  特点是: 操作变量的效率高 //          atomic   ...

  4. equals()方法

    equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...

  5. 【代码笔记】iOS-多张图片合成一张

    代码: RootViewController.m #import "RootViewController.h" @interface RootViewController () @ ...

  6. [Android] android .keystore文件转x509pem工具

    .keystore是android的签名文件,最近在做联通联运的时候,发现他们需要上传x509pem格式的文件来签名所以就研究了一下如何转化 方法一:使用openssl的方法 http://blog. ...

  7. iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付

    产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...

  8. 创建用户故事地图(User Story Mapping)的8个步骤

    [小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...

  9. ASP.NET MVC SSO 单点登录设计与实现

    实验环境配置 HOST文件配置如下: 127.0.0.1 app.com127.0.0.1 sso.com IIS配置如下: 应用程序池采用.Net Framework 4.0 注意IIS绑定的域名, ...

  10. Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj

    Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj 1. 俩个问题::识别垃圾文件与清理策略1 2. 如何识别垃圾图片1 2.1. 体积过小文件<1 ...