Android中利用HttpClient建立一次持久的连接
首先,http协议是无状态的连接,之前的两种方式get,与post连接方式,每点击一次就启动了一个线程,而在启动线程时
很自然的就重新的new出了一个新的HttpClient,相当于两个客户端向服务器发送了请求,这在实际应用中显然是不合理的,由
于Android中没有浏览器类似的Cookie管理机制,所以我们必须保证在Android客户端启动之后,我们对服务器访问的是同一个
Client。这里用到的思想主要是单例,加上同步机制,以下是一个简单的实现案例:
MainActivity.java:
package com.example.test003;import java.io.InputStream; import java.util.ArrayList; import java.util.List;import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONException; import org.json.JSONObject;import com.example.test003.MainActivity;import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;public class MainActivity extends Activity {private EditText et1;private EditText et2;private Button btn1;private Button btn2;private TextView tv3;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et1 = (EditText) super.findViewById(R.id.editText1);et2 = (EditText) super.findViewById(R.id.editText2);tv3 = (TextView)super.findViewById(R.id.textView3);btn1 = (Button)super.findViewById(R.id.button1);btn2 = (Button)super.findViewById(R.id.button2);handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:try {JSONObject obj = (JSONObject) msg.obj;String result = obj.getString("result");if(result.equals("1")){Toast.makeText(MainActivity.this, "欢迎您"+obj.getString("cname"),3000).show();}else{Toast.makeText(MainActivity.this, "登陆失败",3000).show();}} catch (JSONException e) {// TODO Auto-generated catch block e.printStackTrace();}break;case 2:String info = (String) msg.obj;Toast.makeText(MainActivity.this, info,3000).show();break;}}};btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInputStream iis = YcHttpClient.post("http://192.168.14.194:8080/HttpClient_Server/back/index.jsp", null);byte[] bs = IOUtil.read(iis);String s = new String(bs);Message m = new Message();m.what = 2;m.obj = s;handler.sendMessage(m);}}).start();}});btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubnew Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubString cname = et1.getText().toString().trim();String password = et2.getText().toString().trim();String op = "login";List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("cname", cname));params.add(new BasicNameValuePair("password", password));params.add(new BasicNameValuePair("op",op));InputStream iis = YcHttpClient.post(Constants.ADDRESS, params);try {byte[] bs = IOUtil.read(iis);String s = new String(bs);JSONObject obj = new JSONObject(s);Message m = new Message();m.what = 1;m.obj = obj;handler.sendMessage(m);} catch (JSONException e) {// TODO Auto-generated catch block e.printStackTrace();}}}).start();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}
UserHttpClient.java:
package com.example.test003;import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; 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.util.Log; /*** 单例模式,为解决Http协议无状态,模拟一次持久的链接状态* 构造方法私有化 对外提供一个getHttpClient方法,* 并且让这个方法同步,来解决多线程访问的问题* @author dell**/ public class UserHttpClient {private static final String CHARSET = HTTP.UTF_8;private static HttpClient userHttpClient;private static final String TAG = "userHttpClient";//构造方法私有化private UserHttpClient() {}//对外提供getHttpClient方法public static synchronized HttpClient getHttpClient() {//如果userHttpClient == null 即原来没有 userHttpClient 第一次链接if (null == userHttpClient) {// This interface represents a collection of HTTP protocol parameters//这是一个Http协议的集合,里面存放了Http协议的相应参数信息HttpParams params = new BasicHttpParams();// 设置一些基本参数HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); //设置协议的版本HttpProtocolParams.setContentCharset(params, CHARSET); //设置内容的编码集HttpProtocolParams.setUseExpectContinue(params, true); // HttpProtocolParams.setUserAgent(params,"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");// 超时设置/* 从连接池中取连接的超时时间 */ConnManagerParams.setTimeout(params, 1000);/* 连接超时 */HttpConnectionParams.setConnectionTimeout(params, 2000);/* 请求超时 */HttpConnectionParams.setSoTimeout(params, 4000);// 设置我们的HttpClient支持HTTP和HTTPS两种模式SchemeRegistry schReg = new SchemeRegistry();schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));// 使用线程安全的连接管理来创建HttpClientClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);userHttpClient = new DefaultHttpClient(conMgr, params);}return userHttpClient;}/*** * @param url:访问的地址* @param params :要传的参数* @return :服务器返回一个输入流*/public static InputStream post(String url, List<NameValuePair> params) {try {// 编码参数List<NameValuePair> formparams = new ArrayList<NameValuePair>(); // 请求参数if (params != null && params.size() > 0) {for (NameValuePair p : params) {formparams.add(p);}}//创建一个实体,里面存放了要传送的数据 并且对数据进行了编码 :CHARSET -- > utf-8UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, CHARSET);// 创建POST请求HttpPost request = new HttpPost(url);//在请求里把要传送的数据放进去 request.setEntity(entity);// 获取唯一的一个HttpClient实例... 单例模式HttpClient client = getHttpClient();HttpResponse response = client.execute(request);if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {throw new RuntimeException("请求失败");}HttpEntity resEntity = response.getEntity();return (resEntity == null) ? null : resEntity.getContent();} catch (UnsupportedEncodingException e) {Log.w(TAG, e.getMessage());return null;} catch (ClientProtocolException e) {Log.w(TAG, e.getMessage());return null;} catch (IOException e) {throw new RuntimeException("连接失败", e);}} }
IOUtil.java:
package com.example.test003;import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream;public class IOUtil {public static byte[] read(InputStream inputStream){byte[] buffer = new byte[1024];int length = 0;ByteArrayOutputStream baos = new ByteArrayOutputStream();try {while ((length = inputStream.read( buffer,0,buffer.length)) != -1){baos.write(buffer,0,length);inputStream.close();}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}return baos.toByteArray();} }
Constants.java:
package com.example.test003;public class Constants {public final static String ADDRESS = "http://192.168.14.194:8080/HttpClient_Server/cust.action"; }
转载于:https://www.cnblogs.com/EmperLin/p/3497881.html
Android中利用HttpClient建立一次持久的连接相关推荐
- android+网络下载资源,【已解决】Android中利用HttpClient等库实现网络文件下载
[问题] 已经获得了Songtaste中歌曲的地址,比如: 中的真实下载地址是: 然后现在想要去下载这样的文件到Android手机的本地某个文件夹中. [解决过程] 1.其中,关于自动处理Cookie ...
- android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测
如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...
- java线程画动图闪,Android中利用画图类和线程画出闪烁的心形,android心形,package com....
Android中利用画图类和线程画出闪烁的心形,android心形,package com.package com.tt.view;import android.content.Context;imp ...
- android 布局颜色设置颜色设置,怎么在Android中利用view设置布局颜色
怎么在Android中利用view设置布局颜色 发布时间:2020-12-10 16:16:37 来源:亿速云 阅读:154 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中利 ...
- android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能
如何在Android中利用Intent实现一个页面跳转功能 发布时间:2021-02-20 17:06:31 来源:亿速云 阅读:113 作者:Leah 本篇文章为大家展示了如何在Android中利用 ...
- android读写access数据库,Android中利用远程Microsoft Access数据库应用程序
我写一个Android应用程序,它接受一个字符串,通过条码阅读器读取,然后当一个特定的按钮按下时,它会认为字符串发送到数据库将他们的价值设定为"库存"或"缺货" ...
- android计算器功能实现,在android中利用 studio实现一个简单的计算器功能
在android中利用 studio实现一个简单的计算器功能 发布时间:2020-11-07 15:35:20 来源:亿速云 阅读:168 作者:Leah 这篇文章将为大家详细讲解有关在android ...
- android 悬浮按钮 功能实现,怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果...
怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果 发布时间:2020-12-02 17:41:30 来源:亿速云 阅读:238 作者:Leah 今天就跟大家聊聊有 ...
- android progressdialog 背景色,怎么在android中利用ProgressDialog实现一个加载效果
怎么在android中利用ProgressDialog实现一个加载效果 发布时间:2020-12-07 17:00:07 来源:亿速云 阅读:77 作者:Leah 怎么在android中利用Progr ...
最新文章
- 《OpenStack 实战》内容概览与作者采访
- Cortex-M3 异常中断向量表
- es java聚合查询只有10_关于在elasticSearch中使用聚合查询后只显示10个bucket的问题...
- (JAVA)超大整数运算
- php中手机端ajax上拉加载更多,jQuery手机网页上拉加载更多
- 动态规划——最大上升子序列(hdu1087)
- DreamFacotry 第4章 如何保护REST API
- ubuntu 下安装mplayer
- SpringMVC自学日志03(SpringMVC注解)
- Windows下JNI的使用教程
- python isodd()判断奇偶_EXCEL VBA:Iseven Isodd 判断奇偶
- [2]Selenium学习系列---- FirePath的安装和使用
- 植被抽稀lisp程序_地形图缩编中植被符号抽稀方法.doc
- ChinaUnix中的音乐天地
- MogaFX-M1日
- 超大图片的储存/处理/显示
- bigsur cdr文件_clover和oc的杂交-openclover,big sur也可以直接用clover来引导了,小白一步一步教你...
- 一位励志的盲人程序员加我微信,求助找工作
- 解决生产计划排程APS系统七大问题,提升企业生产效率!
- 数据可视化设计师必备的图表规范指南
热门文章
- 聚簇索引、非聚簇索引、普通索引、唯一索引
- UNIX再学习 -- 进程关系
- c语言如何发现错误在哪里,二个C语言例子,编译没通过.不知道错在哪里[求助]
- aapt2 资源 compile 过程
- JZOJ 5600. 【NOI2018模拟3.26】Arg
- JZOJ 1251. 收费站
- 小学4年级计算机课,小学四年级信息技术课件
- python元胞自动机模拟交通_大师兄带你复现 -gt; 难度超高的二维CA元胞自动机模型...
- webstorm怎么跑项目_怎么跑Mint-UI的实例,你知道吗?
- python能做哪些单机游戏好玩_【单机游戏】可以快速用Python进行数据分析的几个小技巧_玩得好游戏攻略...