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对象是怎么生成的的更多相关文章

  1. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  2. Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  3. Android学习记录(1)—Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  4. Android 中HttpURLConnection与HttpClient的简单使用

    1:HttpHelper.java public class HttpHelper { //1:标准的Java接口 public static String getStringFromNet1(Str ...

  5. Android 中HttpClient和HttpURLConnection选取

    原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 译文:http://yunfeng.sin ...

  6. Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局

    一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...

  7. Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...

  8. Android中解析JSON形式的数据

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

  9. Android中的JSON详细总结

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

随机推荐

  1. python redis存入字典序列化存储

    在python中通过redis hset存储字典时,必须主动把字典通过json.dumps()序列化为字符串后再存储, 不然hget获取后将无法通过json.loads()反序列化为字典 序列化存储 ...

  2. FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!

    一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...

  3. C# 中的相对路径在 Picturebox 中的应用

    前言 最近的项目需要将 picturebox 显示网络图片的小功能完成,不想用绝对路径取本地文件里的图片,因为将来要发布给用户的话让用户自己配置会很麻烦的,索性将路径设置成相对路径,将图片放在自己的项 ...

  4. 朱晔和你聊Spring系列S1E5:Spring WebFlux小探

    阅读PDF版本 本文会来做一些应用对比Spring MVC和Spring WebFlux,观察线程模型的区别,然后做一下简单的压力测试. 创建一个传统的Spring MVC应用 先来创建一个新的web ...

  5. python_内置函数1_42

    内置函数 内置函数大全:     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() ...

  6. ES5中文分词(IK)

    ElasticSearch5中文分词(IK) ElasticSearch安装 官网:https://www.elastic.co 1.ElasticSearch安装 1.1.下载安装公共密钥 rpm ...

  7. Elasticsearch IK+pinyin

    如何在Elasticsearch中安装中文分词器(IK+pinyin)   如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字 ...

  8. javaweb之Cookie学习

    Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子, ...

  9. CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接

    OpenVPNhttp://info.swufe.edu.cn/vpn/openvpn/#2 苹果.安卓智能手机openvpn的设置_百度经验https://jingyan.baidu.com/art ...

  10. jmeter接口测试------基础笔记

    1.postman发送json格式的post请求,直接放链接 row里面body放请求参数,得到请求结果 2.jmeter请求json时需要注意在请求前创建http信息头管理器,然后信息头添加一条名称 ...