首先,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建立一次持久的连接相关推荐

  1. android+网络下载资源,【已解决】Android中利用HttpClient等库实现网络文件下载

    [问题] 已经获得了Songtaste中歌曲的地址,比如: 中的真实下载地址是: 然后现在想要去下载这样的文件到Android手机的本地某个文件夹中. [解决过程] 1.其中,关于自动处理Cookie ...

  2. android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测

    如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...

  3. java线程画动图闪,Android中利用画图类和线程画出闪烁的心形,android心形,package com....

    Android中利用画图类和线程画出闪烁的心形,android心形,package com.package com.tt.view;import android.content.Context;imp ...

  4. android 布局颜色设置颜色设置,怎么在Android中利用view设置布局颜色

    怎么在Android中利用view设置布局颜色 发布时间:2020-12-10 16:16:37 来源:亿速云 阅读:154 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中利 ...

  5. android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能

    如何在Android中利用Intent实现一个页面跳转功能 发布时间:2021-02-20 17:06:31 来源:亿速云 阅读:113 作者:Leah 本篇文章为大家展示了如何在Android中利用 ...

  6. android读写access数据库,Android中利用远程Microsoft Access数据库应用程序

    我写一个Android应用程序,它接受一个字符串,通过条码阅读器读取,然后当一个特定的按钮按下时,它会认为字符串发送到数据库将他们的价值设定为"库存"或"缺货" ...

  7. android计算器功能实现,在android中利用 studio实现一个简单的计算器功能

    在android中利用 studio实现一个简单的计算器功能 发布时间:2020-11-07 15:35:20 来源:亿速云 阅读:168 作者:Leah 这篇文章将为大家详细讲解有关在android ...

  8. android 悬浮按钮 功能实现,怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果...

    怎么在Android中利用FloatingActionButton实现一个悬浮按钮效果 发布时间:2020-12-02 17:41:30 来源:亿速云 阅读:238 作者:Leah 今天就跟大家聊聊有 ...

  9. android progressdialog 背景色,怎么在android中利用ProgressDialog实现一个加载效果

    怎么在android中利用ProgressDialog实现一个加载效果 发布时间:2020-12-07 17:00:07 来源:亿速云 阅读:77 作者:Leah 怎么在android中利用Progr ...

最新文章

  1. 《OpenStack 实战》内容概览与作者采访
  2. Cortex-M3 异常中断向量表
  3. es java聚合查询只有10_关于在elasticSearch中使用聚合查询后只显示10个bucket的问题...
  4. (JAVA)超大整数运算
  5. php中手机端ajax上拉加载更多,jQuery手机网页上拉加载更多
  6. 动态规划——最大上升子序列(hdu1087)
  7. DreamFacotry 第4章 如何保护REST API
  8. ubuntu 下安装mplayer
  9. SpringMVC自学日志03(SpringMVC注解)
  10. Windows下JNI的使用教程
  11. python isodd()判断奇偶_EXCEL VBA:Iseven Isodd 判断奇偶
  12. [2]Selenium学习系列---- FirePath的安装和使用
  13. 植被抽稀lisp程序_地形图缩编中植被符号抽稀方法.doc
  14. ChinaUnix中的音乐天地
  15. MogaFX-M1日
  16. 超大图片的储存/处理/显示
  17. bigsur cdr文件_clover和oc的杂交-openclover,big sur也可以直接用clover来引导了,小白一步一步教你...
  18. 一位励志的盲人程序员加我微信,求助找工作
  19. 解决生产计划排程APS系统七大问题,提升企业生产效率!
  20. 数据可视化设计师必备的图表规范指南

热门文章

  1. 聚簇索引、非聚簇索引、普通索引、唯一索引
  2. UNIX再学习 -- 进程关系
  3. c语言如何发现错误在哪里,二个C语言例子,编译没通过.不知道错在哪里[求助]
  4. aapt2 资源 compile 过程
  5. JZOJ 5600. 【NOI2018模拟3.26】Arg
  6. JZOJ 1251. 收费站
  7. 小学4年级计算机课,小学四年级信息技术课件
  8. python元胞自动机模拟交通_大师兄带你复现 -gt; 难度超高的二维CA元胞自动机模型...
  9. webstorm怎么跑项目_怎么跑Mint-UI的实例,你知道吗?
  10. python能做哪些单机游戏好玩_【单机游戏】可以快速用Python进行数据分析的几个小技巧_玩得好游戏攻略...