自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

N0tExpecterr0r的博客

空持百千偈,不如吃茶去

  • 博客(51)
  • 收藏
  • 关注

原创 JDK 动态代理源码解析

Java 提供给了我们一个非常方便的动态代理类 Proxy,让我们今天来研究一下它的实现原理,以及为什么动态代理会存在性能问题。代理对象的创建我们往往通过 newProxyInstance(ClassLoader, Class<?>[], InvocationHandler) 方法进行代理对象的创建,它传递了三个参数:loader、interfaces 以及 h:public s...

2019-12-24 13:23:15 246 1

原创 Retrofit 源码解析:一款基于 OkHttp 的网络请求库

Retrofit 可以说和 OkHttp 是亲兄弟了,它们都是由 Square 公司推出的网络请求库,并且 Retrofit 实际上是基于 OkHttp 实现的,它在 OkHttp 现有功能的基础上进行了封装,支持通过注解进行网络请求参数的配置,同时对数据返回后的解析、序列化进行了统一的包装,甚至在近期引入了对协程对支持。今天就让我们一起来看看 Retrofit 是如何在 OkHttp 这样一个...

2019-12-21 21:39:08 310

原创 Volley 源码解析: 一款 Google 推出的网络请求框架

本篇源码解析基于 Volley 1.1.1个人博客:https://blog.N0tExpectErr0r.cn小专栏:https://xiaozhuanlan.com/N0tExpectErr0rVolley 是 Google 开发的一款网络请求框架,目前已停止更新。虽然目前大家的关注焦点都在 Retrofit、OkHttp 等第三方网络请求框架,团队的项目中所用的也是这两个框架,但 ...

2019-12-17 11:25:21 315

原创 Okio 源码解析 : 一套精简高效的 I/O 库

从前面的 OkHttp 源码解析中我们可以知道,OkHttp 中的 I/O 都不是通过我们平时所使用的 IOStream 来实现,而是使用了 Okio 这个第三方库,那它与寻常的 IOStream 有什么区别呢?让我们来分析一下它的源码。Okio 中有两个非常重要的接口——Sink 以及 Source,它们都继承了 Closeable,其中 Sink 对应了我们原来所使用的 OutputStre...

2019-12-17 11:16:11 270

原创 C++ 中的泛型——template浅析

本文出自神农班,神农班宗旨及班规:https://mp.weixin.qq.com/s/Kzi_8qNqt_OUM_xCxCDlKAC++ 的模板是一个比较复杂的领域,在 C++ 中的应用十分广泛,它和 Java 中的泛型有相似之处,但本质上却有非常大的不同。出于好奇,在阿拉神农老师的指导下,写下了这篇文章,对 C++ 的模板进行一系列的学习。模板的引入及意义首先我们来思考一个问题:为什...

2019-09-20 14:02:55 837

原创 OkHttp3.14 源码剖析系列(七)——请求的发起及响应的读取

终于来到了我们 OkHttp 的最后一个部分——请求的发起。让我们回顾一下 CallServerInterceptor 的大体流程:调用 exchange.writeRequestHeaders 写入请求头调用 exchange.createRequestBody 获取 Sink调用 ResponseBody.writeTo 写入请求体调用 exchange.readResponseHe...

2019-08-08 10:15:22 956

原创 OkHttp3.14 源码剖析系列(六)——连接复用机制及连接的建立

当 findConnection 的过程中无法从 transmitter 中取得 Connection 时,会调用 connectionPool.transmitterAcquirePooledConnection 方法来尝试从连接池中获取连接,让我们从这篇文章开始研究一下 OkHttp 中连接池的实现。HTTP 中的复用机制HTTP/1.0在 HTTP/1.0 中,由于 HTTP 协议是一...

2019-08-08 10:12:27 766

原创 OkHttp3.14 源码剖析系列(五)——路由选择机制

路由选择当我们第一次尝试从连接池获取连接获取不到时,若检查发现路由选择器中没有可供选择的路由,首先会进行一次路由选择的过程,因为 HTTP 请求的过程中,需要先找到一个可用的路由,再根据代理协议规则与目标建立 TCP 连接。Route我们先了解一下 OkHttp 中的 Route 类:public final class Route { final Address address;...

2019-08-08 10:09:33 603

原创 OkHttp3.14 源码剖析系列(四)——连接的建立概述

前面的文章分析完了 OkHttp 中的缓存机制,现在让我们继续来研究其在 ConnectInterceptor 中所进行的连接建立的相关原理。由于连接建立的过程涉及到很多在 OkHttp 中非常重要的机制,因此将分为多篇文章进行介绍,这篇文章主要是对连接建立的大体流程进行介绍。连接建立流程概述在 ConnectInterceptor.intercept 方法中真正实现了连接的建立的代码如下:...

2019-08-08 10:07:08 781

原创 OkHttp3.14 源码剖析系列(三)——缓存机制分析

我们知道,在 CacheInterceptor 中实现了 OkHttp 中对 Response 的缓存功能,CacheInterceptor 的具体逻辑在前面的博客已经分析过,但里面对缓存机制的详细实现没有进行介绍。这篇文章中我们将对 OkHttp 的缓存机制的具体实现进行详细的介绍。HTTP 中的缓存我们先来了解一下 HTTP 协议中与缓存相关的知识。Cache-ControlCache...

2019-08-08 10:05:09 308

原创 OkHttp3.14 源码剖析系列(二)——拦截器大体流程分析

之前的文章介绍到了 OkHttp 的拦截器机制的整体概述,现在让我们依次研究一下其拦截器的实现。RetryAndFollowUpInterceptor前面提到,RetryAndFollowUpInerceptor 负责了 HTTP 请求的重定向功能,那让我们先了解一下 HTTP 协议中的重定向。HTTP 中的重定向HTTP 协议提供了一种重定向的功能,它通过由服务器返回特定格式的响应从而触...

2019-08-08 09:57:49 315

原创 OkHttp3.14 源码剖析系列(一)——请求的发起及拦截器机制概述

OkHttp 是一个我从学 Android 开始就接触的网络请求库了,想想现在也陪伴它快两年了,却没有系统性地对它进行过一次系统性的源码解析。因此准备开设这样一个系列,对 OkHttp 的源码进行解析。此篇源码解析基于 OkHttp 3.14OkHttpClient我们都知道,使用 OkHttp 我们首先需要创建并获得一个 OkHttpClient,OkHttpClient 是 OkHttp...

2019-08-08 09:55:20 399

原创 同步屏障?阻塞唤醒?和我一起重读Handler源码

大家应该都知道,Android 的消息机制是基于 Handler 实现的。还记得一年前的自己就看了几篇博客,知道了 Handler、Looper、MessageQueue 就自以为自己知道了 Handler 的原理。但其实看源码的过程中慢慢就会发现,Handler 的内容可不止这点, 像同步屏障还有 Handler 的 native 层的实现这些知识以前就没有理解清楚。因此写下此篇文章,从头开始重...

2019-07-29 09:23:05 403

原创 十分钟带你读懂轻量级图片加载库Picasso源码

Picasso 源码解析各位好久不见…已经一两个月没更新了…过完年一直在忙着学校的一些事情和项目上的事,就没太多时间写笔记,现在我回来啦。Picasso 是 Square 公司出品的一款十分优秀的开源图片框架,也是目前 Android 开发中十分流行的一款图片加载框架。提到 Square 公司大家一定不会陌生,OkHttp、Retrofit、LeakCanary 等等 Android 开发者...

2019-07-05 09:35:46 298

原创 Android 轻量级缓存 SharedPreferences 源码解析

本文是独立解析源码的第二篇,SharedPreference 是一个 Android 开发自带的适合保存轻量级数据的 K-V 存储库,它使用了 XML 的方式来存储数据,比如我就经常用它保存一些如用户登录信息等轻量级数据。那么今天就让我们来分析一下它的源码,研究一下其内部实现。获取SharedPreferences我们在使用 SharedPreferences 时首先是需要获取到这个 Shar...

2019-06-11 18:13:44 278

原创 腾讯开源轻量级缓存 MMKV 源码解析

突然发现 CSDN 自己很久没有更新了,所以决定现在开始恢复更新,先更新一些最近写的文章。MMKV 是腾讯于 2018 年 9 月 20 日开源的一个 K-V 组件,下面是官方对它的介绍:MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期...

2019-06-11 18:04:46 2347

原创 Android组件化打造知乎日报系列(二)—— 主界面框架搭建

本节完整代码可以前往github查看,项目地址:https://github.com/N0tExpectErr0r/Zhihu-Daily文章目录:Android组件化打造知乎日报系列(一)—— 项目架构搭建AppModuleAppModule是我们的壳工程,我们通过这个壳工程来将各个组件层的Module集合到一起。在AppModule中我们只有一个空的Activity—Launcher...

2018-11-29 16:40:08 313

原创 Android组件化打造知乎日报系列(一)—— 项目架构搭建

本节完整代码可以前往github查看,项目地址:https://github.com/N0tExpectErr0r/Zhihu-Daily写在前面为什么下定决心要写这样一个系列呢?第一个原因是写博客的过程中受到了朋友的提示,慢慢意识到了一个问题——自己之前所写的博客都是很零散的知识点,更多是面向自己的学习笔记。这样写博客是无法练习自己的表达能力的,同时这样的博客也不会有人愿意看的。第二个原...

2018-11-29 16:11:35 364

原创 Android进阶之自定义注解

由于自己之前常用到的很多开源框架比如GreenDao、EventBus、ButterKnife、ARouter等都用到了自定义的注解,感觉自己应该花时间去学一下怎么在自己写的库中用到注解了,因此写下了这样一篇文章。什么是注解首先,要明白什么是注解。An annotation is a form of metadata, that can be added to Java source co...

2018-11-21 13:15:51 231

原创 HTTPS协议浅析

目前很多网站都开始不再使用HTTP协议,而是使用HTTPS协议,原因是因为它相比HTTP协议更加安全。那么,它究竟安全在哪里呢?HTTP协议为何不安全在说明为何HTTPS是一个安全的协议之前,我们先来讨论HTTP协议为什么是不安全的。问题一:中间节点我们使用的HTTP协议,是由客户端(APP 浏览器等)向服务器发送一个请求报文,包含了请求信息。服务器接收到请求报文后,根据请求的内容返回对应...

2018-11-20 13:22:34 241

原创 Android NDK的基本使用,这一篇就够了

JNI概念JNI是Java Native Interface的简写,它可以使Java与其他语言(如C、C++)进行交互。它是Java调用Native语言的一种特性,属于Java语言的范畴,与Android无关。为何需要JNIJava的源文件非常容易被反编译,而通过Native语言生成的.so库文件则不容易被反编译。有时候会有一种情况就是当我们使用Java时需要使用到一些库来实现某些功...

2018-11-16 19:05:24 3075

原创 Android学习笔记——Android系统的启动流程(三个进程以及Launcher)

首先要感谢**@刘望舒**大神的博客,让我们这些渣渣有途径更快速地接触到Android框架层的内容。本篇博客主要基于Android7.0来分析Android系统的启动流程。init进程启动过程init进程init进程是Android系统中用户空间的第一个进程。作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等等。i由多个源文件共同组成,这些文件位...

2018-10-25 16:14:02 1024

原创 关于Context的理解与总结——什么是Context?

作为一个Android开发者,我们在Android开发中经常会使用到Context这个类。它在加载资源、启动Activity、获取系统服务、创建View等活动中都需要参与。但Context到底是什么,我就很少去关注了…那么我们该如何理解去Context呢?它到底是什么呢?什么是Context翻译角度Context翻译为中文,有:上下文、背景、环境等翻译,我们可以把Context理解成一种环...

2018-10-20 11:30:34 3280

原创 为什么说Java的泛型是“假泛型”?

Java泛型Java的泛型是JDK5带来的新特性,它有如下的优点:适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是“模版”但是,为了做到向下兼容,Java中的泛型仅仅是一个语法糖,并不是C++那样的真泛型。如何证明呢?我们可以看看下面的例子证明在这个例子中,我们定义了一个List&lt;Integer&gt;集合,我们可以调用add方法向其中加入Inte...

2018-10-20 11:29:39 4239 2

原创 Java的四种引用——强引用、弱引用、软引用、虚引用

众所周知,Java是有四种引用的,分别是:强引用、弱引用、软引用、虚引用。为了学习这些引用之间的区别和联系,写下这篇博客。参考自此博客强引用我们平时用到的最普遍的引用,就是强引用。如果一个对象具有强引用,GC就不会回收它。比如下面就是一个强引用Object o = new Object(); // 强引用当我们内存不足时,Java虚拟机宁愿抛出OutOfMemoryError异常也...

2018-10-20 11:28:44 196

原创 设计模式之适配器模式

设计模式之适配器模式参考文章:https://www.jianshu.com/p/9d0575311214定义适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。使用场景用电源接口做例子,笔记本电脑的电源一般都是接受5V的电压,但是我们生活中的电线电压一般都是220V的输出。这个时候就出现了不匹配的状况,我们称之为接口不兼容...

2018-09-20 13:15:50 229

原创 设计模式之责任链模式

设计模式之责任链模式责任链模式是一种行为模式,它从一个起点发起请求,沿着任务链传递给每个节点的对象,直至有一个节点处理了这个请求。它使得多个对象都有机会来处理请求,避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它。比较类似Android的View的事件分发机制。使用场景可以多个对象处理统一请求,具体谁来处理在运行时动态决定在请求的...

2018-09-20 13:14:38 208

原创 设计模式之观察者模式

设计模式之观察者模式介绍观察者模式是一种使用频率非常高的设计模式,最常用的地方就是订阅-发布系统。 这个模式的重要作用就是将观察者和被观察者解耦,使他们之间的依赖更小甚至没有。观察者模式又被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。使用场景关联行为场景,这...

2018-09-20 13:13:48 175

原创 面向对象设计原则及常见设计模式的总结

面向对象设计原则及常见设计模式的总结参考文章https://juejin.im/entry/5917d38dda2f60005de8def4https://www.jianshu.com/p/a3474f4fee57面向对象思想设计原则单一职责原则其实就是开发人员经常说的“高内聚,低耦合”也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。...

2018-09-20 13:12:52 283

原创 Android Google的网络请求库Volley的基本使用及原理浅析

Google的网络请求库Volley的基本使用及原理浅析介绍Volley是Google在2013年发布的一款Android平台上的网络请求库。它有如下特点:使得网络通信更快,更简单GET、POST网络请求及网络图像的高效异步处理请求可以对网络请求进行排序优先级处理网络请求的缓存多级别取消请求与Activity生命周期的联动但它也有一定缺点:不适合进行数据的上传与下载...

2018-09-20 13:11:16 308 2

原创 Android View原理浅析——View的事件体系

Android View原理浅析——View的事件体系View是什么首先我们需要理解什么是View。View是安卓中所有控件的基类,无论是简单的TextView、Button,还是复杂的LinearLayout、ListView,它们的共同基类都是View,ViewGroup其实也是继承了View。Button是一个View,而LinearLayout是View的同时也是ViewGroup,V...

2018-09-19 10:34:35 288

原创 Android View原理浅析——View的事件分发机制

Android View原理浅析——View的事件分发机制事件分发机制是View的一个核心知识点。它也是解决滑动冲突的一个理论基础。因此掌握好View的事件分发机制是十分重要的。点击事件的传递规则首先要明白,这里要分析的对象就是MotionEvent,即点击事件。点击事件的分发,实际就是MotionEvent的分发过程。MotionEvent产生后,系统需要将这个事件传递给一个具体的View...

2018-09-19 10:32:42 246

原创 Android View原理浅析——View的工作原理

Android View原理浅析——View的工作原理下图是Android的UI管理系统的层级关系。PhoneWindow是Android系统中最基本的窗口系统,继承自Windows类,负责管理界面显示以及事件响应。它是Activity与View系统交互的接口DecorView是PhoneWindow中的起始节点View,继承于View类,作为整个视图容器来使用。用于设置窗口属性。它本质...

2018-09-19 10:31:34 12446 4

原创 Android开发PopupWindow的使用总结

PopupWindow的使用总结PopupWindow是一个以弹窗的方式呈现的控件,可以利用它实现各种各样的弹窗效果,进行信息的展示或者UI的交互。使用使用PopupWindow非常简单,大概分为两步:调用PopupWindow的构造器创建PopupWindow对象,并完成一些初始化设置。调用PopupWindow的showAsDropDown(View view)将PopupWind...

2018-09-19 10:27:22 206

原创 Okhttp网络框架的基本使用及源码解析

Okhttp网络框架的学习及源码分析HTTP及相关协议HTTP协议出现及发展1960年美国人Ted Nelson提出想法由万维网协会(www)和互联网工程工作共同研究目前使用最广泛的是HTTP1.1HTTP协议结构HTTP协议的结构有四个主要组成部分:请求头表明本次请求的客户端本次请求所使用的cookie(标明本次请求的用户身份)本次请求希望返回的数据类型(json...

2018-09-19 10:26:10 903 1

原创 ListView的使用及打造万能Adapter

ListView的使用及打造万能AdapterListView学习ListView与RecyclerView的不同ListView可以用OnItemClickListener方便地对Item的点击事件作出回应。RecyclerView可以通过LayoutManager实现不同的布局效果。并且可设置横向或纵向滑动ListView本身没有ViewHolder,需要自己写ViewHolder...

2018-09-19 10:24:47 173

原创 EventBus的初步学习及使用

EventBus的初步学习及使用常用的消息传递一个实现了监听器接口的类,必须把它自身注册到想要监听的类中去使用广播,内部实现都需要IPC,传递效率上来说不适合上层组件的通信Activity间的消息传递通过 startActivityForResult 和 onActivityResult,会产生比较多逻辑判断。并且Intent及Bundle传值需要进行类型的检测,易发生错误Event...

2018-09-19 10:23:03 169

原创 Java 多线程总结笔记

Java多线程总结笔记实现多线程的方法查看Thread类的源码,可以发现它实现了Runnable接口,然后在自己的run方法中调用了Runnable的run方法。这里其实就是静态代理这一设计模式,Thread是代理角色,而Runnable则是真实角色。在Thread的start方法中,会为我们开辟新的线程并执行其run方法,而Thread的run方法会调用它内部持有引用的Runnable的ru...

2018-09-19 10:21:56 4289 1

原创 Handler完全解读——Handler原理分析

Handler完全解读——Handler原理分析Android为何设计只能通过Handler机制来更新UI呢?最根本原因:解决多线程并发问题。比如假设在一个Activity中,有多个线程来更新UI,并且都没有加锁,会发生什么情况呢?界面错乱那么如果我们对更新UI的操作都进行加锁的话,又会产生怎样的问题?性能下降基于对上述问题的考虑,Android给我们提供了一套更新UI的机制...

2018-09-18 15:55:03 270

原创 Handler完全解读——Handler的使用

Handler完全解读——Handler的使用Handler是什么Handler是Android给我们提供用于更新UI的一套机制,也是一套消息处理机制。我们用它可以发送消息,也可以用它处理消息。在Android开发中有着非常重要的地位。为什么要使用Handler当一个应用程序运行时,它会创建一个进程。这个进程就是我们的主线程(UI线程&amp;Activity Thread) 。在主线程中...

2018-09-18 15:52:57 7701

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除