对象Pro,Android学习笔记(七一) HTTP服务(5) 多线程调用HttpClient

android 5 1  时间:2021-01-22  阅读:()

Pro,Android学习笔记七一 HTTP服务5多线程调用

HttpClient

Pro Android学习笔记七一服务5 多线程调用用HttpClient文章只能用于非商业性质且不能带有虚拟货币、积分、注册等附加条件须注明出处 blog.csdn./flowingflying/应用共享

HttpClient对象的同步问题在之前的例子中HttpClient只用于某个请求我们可以为整个应用创建一个共享的HttpClient对象。这就存在多线程使用的问题而HttpClient已经考虑这个问题只需要创建一个使用ThreadSafeCli entConnManager的

DefaultHttpClient对象。

创建共享HttpClient代码创建共享对象创建共享对象的方式是通用如下public class CustomHttpClient { private static HttpClientclient = null ; //应用共享的对象/*采用采用private的构造器禁止了其他类通过CustomHttpClient xx = new

CustomHttpClient() ;这种方式创建对象确保对象的唯一性这种方式创建对象确保对象的唯一性*/private CustomHttpClient() { }/*通过静态调用获取对象第一次调用为空时进行创建*/ publ icstatic synchronized HttpClientgetCustomHttpClient() { if(client == null) { /*如果对象为空

创建之*/ . . . . . . } return client; } /*禁止禁止clone 同样也是保证对象的唯一性 同样也是保证对象的唯一性*/public Objectc() throws CloneNotSupportedException{ throw new

CloneNotSupportedException() ; } }

创建可共享的HttpClient对象下面给出上面中省略的部分当对象为空是创建HttpClient对象的代码为了方便理解代码从可以从后往前看。

// 【2. 1 】设置Http参数参数HttpParams params = newBasi cHttpParams() ; /*设置设置HttpParam是的基本参数是的基本参数其实都是对应请求的消息头。其中三个都很好理解重点介绍一些setUserExpectContinue。

一般都设置为flase设置为true通常是传递request消息很大

例携带大文件 而服务器可能需要认证我们不希望传完这个大文件才收到服务器的拒绝。是TCP流方式当server收到请求的头字段是Except 100-continue不在等待整个请求返回100continue应答继续读取或者给出拒绝请求final Status code如4xx 。

具体可以参

考 .w3/Protocols/rfc2616/rfc2616-sec8.html#sec8.2. 3 */Vers ion(params, HttpVersion._1_1) ;

HttpProtocolParams. setContentChars et(params, .DEFAULT_CONTENT_CHARSET) ; ExpectContinue(params, true) ;

HttpProtocolParams. setUserAgent(params, "Mozil la/5.0 (Linux;U; Android 2.2. 1 ; en-us; Nexus One Build/FRG83)" + "

AppleWebKit/533. 1 (KHTML, like Gecko) Version/4.0 MobileSafari/533. 1") ; /*设置超时时间。

设置超时时间。超时的异常均属于IOException此外

ClientProtocolException也是与IOException*/ //从

ClientConnect ionManager获取连接的时间这是从连接池中获取连接的超时设置只有在连接池所有连接都在使用的情况下才可能出现超时。超时会扔出ConnectionPoolTimeoutException。一个HttpClient对应管理器有连接池里面有多个连接socket 这是我对其架构的猜测。

ConnManagerParams. se tTi meout(params, 1000) ; //这是连接到远端web server的超时设置超时会扔出

ConnectTimeoutException

HttpConnectionParams. setConnect ionTimeout(params, 5000) ;//

连接超时//这是发送请求消息后最多等待多长时间得到响应的设置超时会扔出SocketTimeoutException

HttpConnectionParams. setSoTimeout(params, 10000) ;//socket超时// 【2.2 】设置Sheme 注册了和和s SchemeRegistry schReg= new SchemeRegistry() ;

",PlainSocketFactory.getSocketFactory() , 80)) ;schReg.register(new

Scheme("s",PlainSocketFactory.getSocketFactory() , 443) ) ; //

【2 】 ClientConnect ionManager用于管理连接我们使用同一个client用来处理请求要确保多线程的使用安全采用

ThreadSafeCli entConnManager 是线程安全的连接池。如果多个线程同时请求或有延迟情况。

是线程安全的连接池。如果多个线程同时请求或有延迟情况。

Cl ientConnectionManager conMgr = new

ThreadSafeCl i entConnManager(params, schReg) ; // 【1 】以ThreadSafeCli entConnManager为管理器参数创建可进行多线程调的用的同步保护的HttpClient对象对象client = new

DefaultHttpCl ient(conMgr,params) ;使用共享HttpClient对象的代码基础代码下面给出Activity调用这个共享的HttpClient的代码

public class HttpActivity extends Activity{ privateHttpClient client = null; protected void onCreate(BundlesavedInstanceState) {……//UI处理等client =

CustomHttpClient.getCustomHttpClient() ; getHttpContent() ; }private void getHttpContent() { try{ HttpGet request = newHttpGet(".google. ") ; /*在处理在处理response时利用Android提供的BasicResponseHandler handleResponse(HttpResponse response)  Returns the responsebody as a String. if the response was suessful (a 2xx statuscode) . */ String page = client. execute(request,new

BasicResponseHandler() ) ;

Log.d("PRO-",page) ; }catch(IOExcepti one) { e.printStackTrace() ; } } }修改连接的参数我们在创建HttpClient时已经设置了有关的连接参数实际对应的是请求消息中的消息头如果某个请求需要对这些参数进行修改不应对公共属性进行修改否则会影响到其他请求而是通过对具体的request请求进行设置。代码例子如下

//我们设置了内部网的一个空地址通过LogCat中连接超时出现的时间来判断参数修改是否成功

HttpGet request =new HttpGet("192. 168.0. 199") ; //读取Ct的参数设置HttpParams cl ientParams=client.getParams() ;

Log.d("PRO-",Log.d(String.valueOf(HttpConnect ionParams.getConnectionTimeout(cl ientParams)) ) ;//显示为5000

Log.d("PRO-",String.valueOf(HttpConnect ionParams.getSoTimeout(clientParams) )) ;//显示为10000 //原来设置的连接超时是5秒下面将重新设置该参数设为20秒我们将新在的参数设置在request中将不影响其他的请求中将不影响其他的请求Paramsparams = request.getParams() ;

HttpConnectionParams. setConnect ionTimeout(params,

20000) ;//20s request. setParams(params) ;

Log.d("PRO-",String.valueOf(HttpConnect ionParams.getConnecti onTimeout(params)) ) ;//显示20000

Log.d("PRO-",String.valueOf(HttpConnect ionParams.getSoTimeout(params) )) ; //显示0使用共同的Appcl iat ion对象对于应用全局共享同一对象使人想起appcl i cat ion对象对于Andro id应用都会有一个application对象在在应用中可以通过getApplicationContext()或者getApplication()来获得。如果我们没有自定义的App l icati on类就是用andro id.app.Appl i cat ion。我们当然也可以将HttpClient对象放置在自定义的application类但是为了这点小事来是App l icati on类变得复杂并不可取。

在此我们将探讨自定义的Appcl i ati on。很简单只要创建自定义的Application类即可至于application对象的创建均有系统来完成。下面我们在自定义的App l icati on中加入一个计数器。import android.app.Application; public class

CustomApplication extends Application{ private int counter =0; public int getCounter() { return ++counter; } }

在应用的所有组件都都可以app l icati on对象且是唯一的一个。从运行结果看出获得这个对象有好几种方式。

CustomApplication app =

(CustomApplication)getApplication() ; unter: " +app.getCounter() ) ; //测试一下计数器是否正常pp) ;

Log.d("PRO-wei", "context: " + app.getApplicationContext() ) ;//测试一下获得app类的其他方式Log.d("PRO-wei", "context: "+getAppl icationContext()) ; //测试一下获得app类的其他方式本博文涉及的例子代码可以在Pro Android学习 Http service小例子中下载。

相关链接

我的Andro id开发相关文章模板,内容仅供参考

华为云年中聚惠618活动,新用户专区,云服务器低至88元/年,3年仅580.98元,热销抢购中,最后2天!

华为云怎么样?华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景AI战略提供强大的算力平台和更易用的开发平台。本次年终聚惠618活动相当给力,1核2G内存1m云耀云服务器仅88元/年起,送主机安全基础版套餐,...

免费注册宝塔面板账户赠送价值3188礼包适合购买抵扣折扣

对于一般的用户来说,我们使用宝塔面板免费版本功能还是足够的,如果我们有需要付费插件和专业版的功能,且需要的插件比较多,实际上且长期使用的话,还是购买付费专业版或者企业版本划算一些。昨天也有在文章中分享年中促销活动。如今我们是否会发现,我们在安装宝塔面板后是必须强制我们登录账户的,否则一直有弹出登录界面,我们还是注册一个账户比较好。反正免费注册宝塔账户还有代金券赠送。 新注册宝塔账户送代金券我们注册...

舍利云:海外云服务器,6核16G超大带宽vps;支持全球范围,原价516,折后价200元/月!

舍利云怎么样?舍利云推出了6核16G超大带宽316G高性能SSD和CPU,支持全球范围,原价516,折后价200元一月。原价80美元,现价30美元,支持地区:日本,新加坡,荷兰,法国,英国,澳大利亚,加拿大,韩国,美国纽约,美国硅谷,美国洛杉矶,美国亚特兰大,美国迈阿密州,美国西雅图,美国芝加哥,美国达拉斯。舍利云是vps云服务器的销售商家,其产品主要的特色是适合seo和建站,性价比方面非常不错,...

android 5 1为你推荐
百度空间首页怎样登录百度博客电脑管家和360哪个好360和电脑管家哪个好朱祁钰和朱祁镇哪个好明英宗和明代宗哪个皇帝要做得好苹果手机助手哪个好iphone手机助手哪个好用?播放器哪个好手机本地视频播放器哪个好用网络机顶盒哪个好现在用什么网络机顶盒最好?牡丹江教育云空间登录我想知道校园云空间是用什么账号登录的?YunOSyunOS是手机里的什么软件系统啊?360云盘关闭360云盘关闭了 里面的东西怎么办强生月抛强生美瞳有月抛吗
中文国际域名 广东vps vps虚拟服务器 免费申请域名和空间 域名交易网 42u标准机柜尺寸 建站代码 网通代理服务器 坐公交投2700元 宁波服务器 美国网站服务器 网通服务器托管 鲁诺 爱奇艺会员免费试用 防cc攻击 开心online 侦探online 中国域名根服务器 游戏服务器 在线tracert 更多