在Android API Level 9(Android 2.2)之前只能使用DefaultHttpClient类发送http请求。DefaultHttpClient是Apache用于发送http请求的客户端,其提供了强大的API支持,而且基本没有什么bug,但是由于其太过复杂,Android团队在保持向后兼容的情况下,很难对DefaultHttpClient进行增强。为此,Android团队从Android API Level 9开始自己实现了一个发送http请求的客户端类——–HttpURLConnection。

相比于DefaultHttpClient,HttpURLConnection比较轻量级,虽然功能没有DefaultHttpClient那么强大,但是能够满足大部分的需求,所以Android推荐使用HttpURLConnection代替DefaultHttpClient,并不强制使用HttpURLConnection。

但从Android API Level 23(Android 6.0)开始,不能再在Android中使用DefaultHttpClient,强制使用HttpURLConnection

由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不

二者区别

1.    功能上,HttpClient库要丰富很多,提供了很多工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。

2.   HttpClient高级功能代码写起来比较复杂,对开发人员的要求会高一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。

3.   HttpURLConnection在2.3版本增加了一些HTTPS方面的改进,4.0版本增加一些响应的缓存。

4.   HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但要自己写代码处理。

5.   HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

6.   HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本以上),加快了重复请求的速度。

7.   HttpClient 适用于 web browsers, 他们是可扩展的,并且拥有大量的稳定APIs。但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。

8.    HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。这个类起步比较晚,很容易在主要API上做稳步的改善。但是HttpURLConnection在在Android 2.2及以下版本上存在一些令人厌烦的bug,尤其是在读取 InputStream时调用 close()方法,就有可能会导致连接池失效了。

9.    Android团队未来的工作会将更多的时间放在优化HttpURLConnection上,它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。

10.如果一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。这种情况建议使用HttpClient。

11.Android2.3及以上版本建议选用HttpURLConnection,2.2及以下版本建议选用HttpClient。新的应用都建议使用HttpURLConnection。

1、HttpClient的请求方式

这种请求方式在Android6.0版本直接删除了,这种方式在Android2.2版本之前使用比较合适,2.3版本之后比较适合HttpUrlConnection。如果在Android6.0使用的话需要依赖库

android{useLibrary 'org.apache.http.legacy'}
//方法:发送网络请求,获取百度首页的数据。在里面开启线程private void sendRequestWithHttpClient() {new Thread(new Runnable() {@Overridepublic void run() {//用HttpClient发送请求,分为五步HttpClient httpCient = new DefaultHttpClient();//第二步:创建代表请求的对象,参数是访问的服务器地址HttpGet httpGet = new HttpGet("http://www.baidu.com");try {//第三步:执行请求,获取服务器发还的相应对象HttpResponse httpResponse = httpCient.execute(httpGet);//第四步:检查相应的状态是否正常:检查状态码的值是200表示正常if (httpResponse.getStatusLine().getStatusCode() == 200) {//第五步:从相应对象当中取出数据,放到entity当中HttpEntity entity = httpResponse.getEntity();String response = EntityUtils.toString(entity,"utf-8");//将entity 当中的数据转换为字符串//在子线程中将Message对象发出去Message message = new Message();message.what = SHOW_RESPONSE;message.obj = response.toString();handler.sendMessage(message);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();//这个start()方法不要忘记了   

2、HttpURLConnection请求

get方式

package com.lyl.demo;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class Comparison {public static void main(String[] args) {  String reString= urlConnectionGet("http://www.baidu.com");System.out.println(reString);}  public static String urlConnectionGet(String path){try {URL url = new URL(path.trim());//打开连接HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();if(200 == urlConnection.getResponseCode()){//得到输入流InputStream is =urlConnection.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while(-1 != (len = is.read(buffer))){baos.write(buffer,0,len);baos.flush();}return baos.toString("utf-8");}}  catch (IOException e) {e.printStackTrace();}return null;}}

post方式

package com.lyl.demo;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class PostMethod {public static void main(String[] args) {httpPost();}public static void httpPost() {try {URL url = new URL("");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5 * 1000);connection.setReadTimeout(5 * 1000);connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setRequestMethod("POST");connection.setRequestProperty("Connection","keep-Alive");connection.setRequestProperty("Charset", "utf-8");connection.setRequestProperty("Content-type","application/x-www-");String params = "page = 1 & num = 10";OutputStream os = connection.getOutputStream();os.write(params.getBytes());os.flush();os.close();if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream is = connection.getInputStream();StringBuilder sb = new StringBuilder();byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {sb.append(new String(bytes, 0, i, "utf-8"));}is.close();System.out.println("LYL_read:" + sb);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

切记Android4.0开始,Google规定网络请求等耗时操作不能放在主线程(UI线程),防止程序无响应ANR,UI画面卡顿,影响用户体验

       new Thread(new Runnable() {@Overridepublic void run() {//请求网络耗时操作}}).start();

Android Http请求网络HttpClient和HttpUrlConnection相关推荐

  1. Android訪问网络,使用HttpURLConnection还是HttpClient?

    原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 大多数的Android应用程序都会使用HT ...

  2. Android之访问网络,使用HttpURLConnection还是HttpClient?

    <span style="font-family: Arial; font-size: 14px; background-color: rgb(255, 255, 255);" ...

  3. Android HTTP协议请求网络(二)之HttpClient方式

    Android HTTP协议请求网络(一)之认识探索 Android HTTP协议请求网络(三)之HttpURLConnection方式 githup练习demo地址:https://github.c ...

  4. Android之三种网络请求解析数据(最佳案例)

    小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的: 一:AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用 ...

  5. java 打开url连接访问不了,android 应用Java自带的HttpURLConnection 连接网络 读取返回数据...

    android 使用Java自带的HttpURLConnection 连接网络 读取返回数据 @Override protected void onCreate(Bundle savedInstanc ...

  6. Android中的OKHttp请求网络

    OKHttp 文章目录 OKHttp 一.简介 二.基本用法 1.依赖 2.使用OKHttp 2.1.get请求 2.2.post请求 3.案例操作演示(借助runOnUiThread()方法进行线程 ...

  7. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...

  8. Flutter开发之HTTP网络请求:HttpClient(26)

    本文根据 在Flutter中发起HTTP网络请求 编写 对于入门的同学来说,使用的是用dart io中的HttpClient发起的请求,能让我快速接入HTTP网络请求.但HttpClient本身功能较 ...

  9. Android Http请求框架二:xUtils 框架网络请求

    一:对Http不了解的请看 Android Http请求框架一:Get 和 Post 请求 二.正文 1.xUtils 下载地址 github 下载地址  : https://github.com/w ...

最新文章

  1. Android SharedPreferences 的使用
  2. 2020年人工神经网络第二次作业-参考答案第六题
  3. 3G与4G到底有何区别?
  4. 测试用例-其他相关知识
  5. Vue.js05:vue内联样式
  6. java零基础自学首选黑马程序员Java入门教程笔记01
  7. 日本著名数学游戏专家中村义作教授提出这样一个问题:将2520个桔子分给六个儿子
  8. unity3d赛车游戏视频教程
  9. thymeleaf参考手册
  10. win2008服务器系统玩红警,如何让Win8顺利兼容红警2
  11. HTML页面背景图片平铺
  12. 带你了解二进制(基础篇)
  13. 单片机c语言编写注解,单片机C语言程序注解
  14. 使用夜神模拟器进行Android开发调试
  15. 要你命3000List30
  16. 实验2:MIPS指令系统和MIPS体系结构
  17. 成人c语言培训,C语言程序设计在成人教育中教学.doc
  18. 2019中国大学生程序设计竞赛-女生专场(重现赛)
  19. java-模拟自动挡汽车
  20. 为什么JavaScript中的this如此强大?

热门文章

  1. 2022中国统计年鉴Excel版
  2. 基于协作搜索算法的函数寻优及工程优化
  3. Android获取本地图片缩略图终极解决方案
  4. ASCII码字符转换,浮点数转换为字符(笔记)
  5. VS:无法打开文件opencv_world341d.lib
  6. 多云管理平台助力企业数字化转型
  7. Web API接口鉴权方式
  8. PCL: 获取点云的质心(几何中心点)
  9. WIN10系统里的System Guard怎么关闭?
  10. 排序算法六:选择排序之直接选择排序