位置: 编程技术 - 正文

Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

编辑:rootadmin

推荐整理分享Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

zz: class MyHttpClient {private static HttpClient mHttpClient = null;private static final String CHARSET = HTTP.UTF_8;//将构造函数封掉,只能通过对外接口来获取HttpClient实例private MyHttpClient(){}public static HttpClient getHttpClient(){if(mHttpClient == null){mHttpClient = new DefaultHttpClient();}return mHttpClient;}}

上面是最简单的一种单例,确实能够满足需要。但不能满足多线程的要求,即当同时完成多个Http请求时,就出马蛋了。

2、线程安全的HttpClient

幸运的是android已经提供了可以创建线程安全的HttpClient,即通过ClientConnectionManager 来完成。下面贴出完整代码:

[java] view plaincopyprint?<span style="font-family:Comic Sans MS;font-size:px;">package org.yanzi.webutil; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; public class MyHttpClient { private static HttpClient mHttpClient = null; private static final String CHARSET = HTTP.UTF_8; //将构造函数封掉,只能通过对外接口来获取HttpClient实例 private MyHttpClient(){ } public static HttpClient getHttpClient(){ if(mHttpClient == null){ mHttpClient = new DefaultHttpClient(); } return mHttpClient; } public static synchronized HttpClient getSaveHttpClient(){ if(mHttpClient == null){ HttpParams params = new BasicHttpParams(); //设置基本参数 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); //超时设置 /*从连接池中取连接的超时时间*/ ConnManagerParams.setTimeout(params, ); /*连接超时*/ HttpConnectionParams.setConnectionTimeout(params, ); /*请求超时*/ HttpConnectionParams.setSoTimeout(params, ); //设置HttpClient支持HTTp和HTTPS两种模式 SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), )); schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), )); //使用线程安全的连接管理来创建HttpClient ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); mHttpClient = new DefaultHttpClient(conMgr, params); } return mHttpClient; } } </span> 方法getSaveHttpClient()即可获得线程安全的单例httpClient,注释很详细了啥都不说了,可以直接使用。Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

3、已经很完美了,还能不能再优化呢?

可以使用Application来进一步优化创建HttpClient的时机及其他配置。Application的相关知识参见:链接

新建包名org.yanzi.application,在里面新建MyApplication.java,完整代码如下:

[java] view plaincopyprint?<span style="font-family:Comic Sans MS;font-size:px;">package org.yanzi.application; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import android.app.Application; public class MyApplication extends Application { private HttpClient mHttpClient = null; private static final String CHARSET = HTTP.UTF_8; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); mHttpClient = this.createHttpClient(); } @Override public void onTerminate() { // TODO Auto-generated method stub super.onTerminate(); this.shutdownHttpClient(); } @Override public void onLowMemory() { // TODO Auto-generated method stub super.onLowMemory(); this.shutdownHttpClient(); } /**创建HttpClient实例 * @return */ private HttpClient createHttpClient(){ HttpParams params = new BasicHttpParams(); //设置基本参数 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); //超时设置 /*从连接池中取连接的超时时间*/ ConnManagerParams.setTimeout(params, ); /*连接超时*/ HttpConnectionParams.setConnectionTimeout(params, ); /*请求超时*/ HttpConnectionParams.setSoTimeout(params, ); //设置HttpClient支持HTTp和HTTPS两种模式 SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), )); schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), )); //使用线程安全的连接管理来创建HttpClient ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); HttpClient client = new DefaultHttpClient(conMgr, params); return client; } private void shutdownHttpClient(){ if(mHttpClient != null && mHttpClient.getConnectionManager() != null){ mHttpClient.getConnectionManager().shutdown(); } } public HttpClient getHttpClient(){ return mHttpClient; } } </span> 然后再AndroidManifest.xml理添加:

android:name="org.yanzi.application.MyApplication"

[html] view plaincopyprint?<span style="font-family:Comic Sans MS;font-size:px;"> <application android:name="org.yanzi.application.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="org.yanzi.testtomecat.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></span> 然后再Activity里,通过mMyApplication = (MyApplication)getApplication();

mMyApplication.getHttpClient()得到HttpClient就可以使用了。

可以看到在Application的onCreate里就实例化了HttpClient,且在低内存和关闭时关闭连接管理器,释放资源,比2中的写到一个普通文件里更优。

android网络相关的工具类 android网络相关的工具类uses-permissionandroid:name=android.permission.INTERNET/!--查询网络状态权限--uses-permissionandroid:name=android.permission.ACCESS_NETWORK_STATE/粘过去就可

Grade 编译 Android 解决 Error:more than one library with package name Grade编译Android解决Error:morethanonelibrarywithpackagenameError:morethanonelibrarywithpackagename'com.app.XX'Youcantemporarilydisablethiserrorwithandroid.enforceUniquePackageName=falseHowever,thi

一种夜间模式简单实现方案 在android应用开发时,可能会用到夜间模式,一般的解决方案就是用主题。夜间模式一般就涉及道背景,亮度,字体颜色等,所以可以简单通过自定义组

标签: Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

本文链接地址:https://www.jiuchutong.com/biancheng/383307.html 转载请保留说明!

上一篇:BroadcastReceiver广播(骞怎么读什么意思是什么)

下一篇:android网络相关的工具类(android network)

  • 非盈利组织确认及所得税汇算怎么做
  • 如何合伙注册公司
  • 实习生个人所得税需要申报吗
  • 捐赠的费用放在什么科目
  • 一般纳税人普票怎么做分录
  • 事业单位缴纳增值税标准
  • 30万的车税可以抵多少钱
  • 援企稳岗补贴的申请理由
  • 私人口腔诊所会感染艾滋病吗
  • 开具发票时如何选择对应的商品分类编码?
  • 房地产公司产品无偿提供他人使用 税
  • 赔付伤残费用还有误工费用么
  • 非独立核算分公司企业所得税
  • 收到美元货款兑换人民币流程
  • 增值税转售行为怎么做会计处理?
  • 公司成本可以抵扣税吗
  • 税务实名制法人和财务负责人可以是同一人吗?
  • 中标服务费会计科目
  • 建筑行业不管是什么行业
  • 如何冲销账面上的资金
  • 小规模纳税人咨询服务费税率是多少
  • 分公司可以迁移到新公司吗
  • 公司给供电局转账违法吗
  • 企业技术中心认定专精特新
  • 保险公司退还保费
  • 所得税税前扣除税金有哪些
  • 员工旅游计入什么费用
  • 预收账款可以计入
  • win10内存完整性不兼容的驱动程序
  • 进项税和销项税怎么算
  • neo什么意思翻译成中文
  • linux内核与文件系统
  • 增值税的优惠有哪三种形式
  • 进货退回的会计处理
  • thinkphp域名路由
  • php框架yii
  • php实现页面浏览量
  • 资产负债表中的货币资金怎么算
  • erp面试题目100及最佳答案
  • axios和ajax的关系
  • 企业购买机器设备没有发票怎么办
  • 向境外企业支付咨询费
  • 帝国cms配置数据库
  • 所有者投入的资本属于什么会计要素
  • 城建税免征怎么记账
  • 金税盘分盘可以全额抵扣吗
  • 研发人员伙食费可以加计扣除吗为什么
  • 独立核算的生产车间是法律主体吗
  • 无成本票如何避税
  • 差旅费退回怎么写
  • 装修费用摊销计入什么科目
  • 注册资本金印花税税率是2.5还是5
  • 重新计量设定受益计划变动额计入
  • 如何制作会计账簿
  • eclipse连接mysql代码
  • win7系统设置打印机共享
  • win7系统弹出cd
  • win10系统如何查看激活状态
  • centos 6.5网络设置
  • macbook怎么把通知关掉
  • win7z
  • win7系统电脑硬盘图标变了,控制面板也打不开
  • window8.1重装系统
  • Win10 Mobile 14342.1004快速预览版更新 提升电池续航
  • win8系统笔记本忘记开机密码怎么办
  • 安卓闹钟软件下载
  • 方块滚动代码怎么写
  • js的正则表达式
  • 在windows窗口中以下叙述错误的是
  • shell 脚本 判断
  • python中scatter函数
  • cocos2dx quicxk 3.3 导入Json文件布局 UI
  • java gravity
  • 象棋软件编程
  • javascript基础入门视频教程
  • JavaScript中的数据类型分哪为两大类?
  • 北京孩子社保网上怎么缴费
  • 物业管理用房如何缴纳房产税
  • 南通国税电子税务局
  • 广东税务微信公众号微办税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设