Android中HttpURLConnection对象是怎么生成的
try {
URL mUrl = new URL("https://www.jianshu.com/");
HttpURLConnection http = (HttpURLConnection) mUrl.openConnection();
http.setRequestMethod("GET");
http.setConnectTimeout(1024);
http.connect();
int ret = http.getResponseCode();
Log.d("tag", "JianShu response:" + ret);
} catch (Exception e) {
e.printStackTrace();
}
上面的代码块是在Android中使用HttpURLConnection方式访问网站的最简单的代码演示。本篇文章要讲的是上述代码的前两行的流程。即如果你有一个网址字符串,Android是如何把它封装成HttpURLConnection对象的。
其实关于HttpURLConnection访问互联网完全是属于Java层的知识,可以说与Android没有任何关系。但由于我本人是在 Android4.4 源代码环境下进行分析的,并且在Android源代码下我可以很方便地去给这些源码添加打印来跟踪其流程,因此这篇文章就叫在Android下的HttpURLConnection对象由来跟踪。
首先来看看URL对象的实例化过程。打开源码:
./libcore/luni/src/main/java/java/net/URL.java

图1 URL对象的实例化
URL支持以旧的URL对象来实例化新URL对象,不过我想大多数情况下都是只传一个网址参数来实例化的。

图2 URL对象的实例化
对于只传一个网址字符串参数进来实例化的情况,上图带三个参数的URL构造方法大多数代码都不需要去理它。这里值得关心的是上图代码第180行调用的setupStreamHandler()方法。setupStreamHandler()方法里就是实例化一个URLStreamHandler对象而已。setupStreamHandler()方法前半部分也不怎么需要去关心它。只看它后半部分的实现。

图3 setupStreamHandler()后半部分的实现
这块代码就很通俗易懂了,就是根据你前面传进来的网址的前缀来决定实例化哪个URLStreamHandler的子类而已。本例中我们传递的是Https类型的网址,故而URL类对象中的成员变量streamHandler在实例化过后所指向的类对象是 HttpsHandler 类对象。
./external/okhttp/android/main/java/com/squareup/okhttp/HttpsHandler.java
接着上图2,streamHandler变量完成赋值后就接下去执行第188行的URL解析了,这部分代码没什么好讲的。只要你传递的网址参数是合法的,就不用理会它,在我们的正常项目中,也不会有人故意传个不正确的网址下去。
至此,URL对象的实例化就已经完成了。Android已经将我们的网址字符串转化成了URL对象了。
--------------------------------------------------------------------------------------------------
下面我们再看看
mUrl.openConnection();
这个代码在执行的时候其内部都发生了些什么。
首先还是找到URL中关于openConnection()方法的实现。

图4 mUrl.openConnection()
顺着前面分析到的streamHandler的引用对象一路跟上去。发现它会调到
./external/okhttp/android/main/java/com/squareup/okhttp/HttpHandler.java

图5 httphandler.openConnection()
newOkHttpClient()方法的实现如下图所示。

图6 newOkHttpClient()
这里,实例化出一个OkHttpClient类对象后调用它的open()方法,将open()方法执行过后得到的对象作为URLConnection对象返回给APK调用者。
./external/okhttp/src/main/java/com/squareup/okhttp/OkHttpClient.java

图7 OkHttpClient
这块代码也够清晰明了了。就本篇例子而言,会去实例化HttpsURLConnectionImpl类对象。
./external/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java
HttpsURLConnectionImpl.java继承自HttpsURLConnection.java
./libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java
而HttpsURLConnection.java又继承自HttpURLConnection.java
./libcore/luni/src/main/java/java/net/HttpURLConnection.java
至此,我们算是弄明白了Android在拿到用户传入的网址后都干了些什么事,并最终把它封装成HttpURLConnection对象的了。
HttpURLConnection http = (HttpURLConnection) mUrl.openConnection();
换言之,文首贴出的代码中的 http 变量指向的类对象其实是上面流程分析中提到的HttpsURLConnectionImpl类的对象。而假若传入的网址是 http:// 形式的,那么它指向的就是HttpURLConnectionImpl类对象了。
Android中HttpURLConnection对象是怎么生成的的更多相关文章
- Android开发——Android中的二维码生成与扫描
0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...
- Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- Android学习记录(1)—Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- Android 中HttpURLConnection与HttpClient的简单使用
1:HttpHelper.java public class HttpHelper { //1:标准的Java接口 public static String getStringFromNet1(Str ...
- Android 中HttpClient和HttpURLConnection选取
原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 译文:http://yunfeng.sin ...
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...
- Android中解析JSON形式的数据
1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...
- Android中的JSON详细总结
1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...
随机推荐
- python redis存入字典序列化存储
在python中通过redis hset存储字典时,必须主动把字典通过json.dumps()序列化为字符串后再存储, 不然hget获取后将无法通过json.loads()反序列化为字典 序列化存储 ...
- FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...
- C# 中的相对路径在 Picturebox 中的应用
前言 最近的项目需要将 picturebox 显示网络图片的小功能完成,不想用绝对路径取本地文件里的图片,因为将来要发布给用户的话让用户自己配置会很麻烦的,索性将路径设置成相对路径,将图片放在自己的项 ...
- 朱晔和你聊Spring系列S1E5:Spring WebFlux小探
阅读PDF版本 本文会来做一些应用对比Spring MVC和Spring WebFlux,观察线程模型的区别,然后做一下简单的压力测试. 创建一个传统的Spring MVC应用 先来创建一个新的web ...
- python_内置函数1_42
内置函数 内置函数大全: Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() ...
- ES5中文分词(IK)
ElasticSearch5中文分词(IK) ElasticSearch安装 官网:https://www.elastic.co 1.ElasticSearch安装 1.1.下载安装公共密钥 rpm ...
- Elasticsearch IK+pinyin
如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字 ...
- javaweb之Cookie学习
Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子, ...
- CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接
OpenVPNhttp://info.swufe.edu.cn/vpn/openvpn/#2 苹果.安卓智能手机openvpn的设置_百度经验https://jingyan.baidu.com/art ...
- jmeter接口测试------基础笔记
1.postman发送json格式的post请求,直接放链接 row里面body放请求参数,得到请求结果 2.jmeter请求json时需要注意在请求前创建http信息头管理器,然后信息头添加一条名称 ...