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. ASP.NET Core MVC之ViewComponents(视图组件)知多少?

    前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...

  2. 52abp框架asp.net core & Angular快速开发实战视频教程

    课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...

  3. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  4. java 浅克隆 深克隆

    对象的克隆是java的一项高级技术,他可以根据给定的对象,获得与其完全相同的另一个对象. 1.浅克隆主要是复制对象的值 2.深克隆:当类存在聚合关系的时候,克隆就必须考虑聚合对象的克隆,可以复制引用类 ...

  5. Vue $nextTick 原理

    使用场景 在进行获取数据后,需要对新视图进行下一步操作或者其他操作时,发现获取不到 DOM. 原因: 这里就涉及到 Vue 一个很重要的概念:异步更新队列(JS运行机制 . 事件循环). Vue 在观 ...

  6. Python学习第五篇——如何访问字典

    # the example_1 aim to tell how to use dctionary,and how to access list or dictionary infos={"f ...

  7. 替换iframe的内容

    一般就是点个按钮然后在不跳转页面的情况下显示另外一个页面的内容,显示的速度比较快,ifream还算是常用的吧 用的时候实现方式有以下几种, 1.替换src路径(觉得麻烦,没接触过,就不这样干了) 2. ...

  8. Vue之子组件

    全局组件 <script src="./static/vue.min.js"></script> // 导入vue <body> <div ...

  9. 【问题解决方案】The MathType Dll cannot be found 问题解决方案

    先贴几个可能的方法: 如何解决MathPage.wll或MathType.dll文件找不到问题 The MathType Dll cannot be found 问题解决办法 如果还搞不定,试试卸载重 ...

  10. bootstrap 弹窗或者提示框插件 bootstrap-growl 和bootstrap-notify

    Bootstrap简单好用的页面右上角咆哮提示框 - daidaineteasy的专栏 - CSDN博客https://blog.csdn.net/daidaineteasy/article/deta ...