
Android
文章平均质量分 84
N0tExpectErr0r
热爱代码的Android开发者
展开
-
JDK 动态代理源码解析
Java 提供给了我们一个非常方便的动态代理类 Proxy,让我们今天来研究一下它的实现原理,以及为什么动态代理会存在性能问题。代理对象的创建我们往往通过 newProxyInstance(ClassLoader, Class<?>[], InvocationHandler) 方法进行代理对象的创建,它传递了三个参数:loader、interfaces 以及 h:public s...原创 2019-12-24 13:23:15 · 316 阅读 · 1 评论 -
Retrofit 源码解析:一款基于 OkHttp 的网络请求库
Retrofit 可以说和 OkHttp 是亲兄弟了,它们都是由 Square 公司推出的网络请求库,并且 Retrofit 实际上是基于 OkHttp 实现的,它在 OkHttp 现有功能的基础上进行了封装,支持通过注解进行网络请求参数的配置,同时对数据返回后的解析、序列化进行了统一的包装,甚至在近期引入了对协程对支持。今天就让我们一起来看看 Retrofit 是如何在 OkHttp 这样一个...原创 2019-12-21 21:39:08 · 393 阅读 · 0 评论 -
Volley 源码解析: 一款 Google 推出的网络请求框架
本篇源码解析基于 Volley 1.1.1个人博客:https://blog.N0tExpectErr0r.cn小专栏:https://xiaozhuanlan.com/N0tExpectErr0rVolley 是 Google 开发的一款网络请求框架,目前已停止更新。虽然目前大家的关注焦点都在 Retrofit、OkHttp 等第三方网络请求框架,团队的项目中所用的也是这两个框架,但 ...原创 2019-12-17 11:25:21 · 397 阅读 · 0 评论 -
Okio 源码解析 : 一套精简高效的 I/O 库
从前面的 OkHttp 源码解析中我们可以知道,OkHttp 中的 I/O 都不是通过我们平时所使用的 IOStream 来实现,而是使用了 Okio 这个第三方库,那它与寻常的 IOStream 有什么区别呢?让我们来分析一下它的源码。Okio 中有两个非常重要的接口——Sink 以及 Source,它们都继承了 Closeable,其中 Sink 对应了我们原来所使用的 OutputStre...原创 2019-12-17 11:16:11 · 365 阅读 · 0 评论 -
腾讯开源轻量级缓存 MMKV 源码解析
突然发现 优快云 自己很久没有更新了,所以决定现在开始恢复更新,先更新一些最近写的文章。MMKV 是腾讯于 2018 年 9 月 20 日开源的一个 K-V 组件,下面是官方对它的介绍:MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期...原创 2019-06-11 18:04:46 · 2491 阅读 · 0 评论 -
Android组件化打造知乎日报系列(二)—— 主界面框架搭建
本节完整代码可以前往github查看,项目地址:https://github.com/N0tExpectErr0r/Zhihu-Daily文章目录:Android组件化打造知乎日报系列(一)—— 项目架构搭建AppModuleAppModule是我们的壳工程,我们通过这个壳工程来将各个组件层的Module集合到一起。在AppModule中我们只有一个空的Activity—Launcher...原创 2018-11-29 16:40:08 · 372 阅读 · 0 评论 -
Android组件化打造知乎日报系列(一)—— 项目架构搭建
本节完整代码可以前往github查看,项目地址:https://github.com/N0tExpectErr0r/Zhihu-Daily写在前面为什么下定决心要写这样一个系列呢?第一个原因是写博客的过程中受到了朋友的提示,慢慢意识到了一个问题——自己之前所写的博客都是很零散的知识点,更多是面向自己的学习笔记。这样写博客是无法练习自己的表达能力的,同时这样的博客也不会有人愿意看的。第二个原...原创 2018-11-29 16:11:35 · 419 阅读 · 0 评论 -
HTTPS协议浅析
目前很多网站都开始不再使用HTTP协议,而是使用HTTPS协议,原因是因为它相比HTTP协议更加安全。那么,它究竟安全在哪里呢?HTTP协议为何不安全在说明为何HTTPS是一个安全的协议之前,我们先来讨论HTTP协议为什么是不安全的。问题一:中间节点我们使用的HTTP协议,是由客户端(APP 浏览器等)向服务器发送一个请求报文,包含了请求信息。服务器接收到请求报文后,根据请求的内容返回对应...原创 2018-11-20 13:22:34 · 281 阅读 · 0 评论 -
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 · 300 阅读 · 0 评论 -
Android NDK的基本使用,这一篇就够了
JNI概念JNI是Java Native Interface的简写,它可以使Java与其他语言(如C、C++)进行交互。它是Java调用Native语言的一种特性,属于Java语言的范畴,与Android无关。为何需要JNIJava的源文件非常容易被反编译,而通过Native语言生成的.so库文件则不容易被反编译。有时候会有一种情况就是当我们使用Java时需要使用到一些库来实现某些功...原创 2018-11-16 19:05:24 · 3286 阅读 · 0 评论 -
Android学习笔记——Android系统的启动流程(三个进程以及Launcher)
首先要感谢**@刘望舒**大神的博客,让我们这些渣渣有途径更快速地接触到Android框架层的内容。本篇博客主要基于Android7.0来分析Android系统的启动流程。init进程启动过程init进程init进程是Android系统中用户空间的第一个进程。作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等等。i由多个源文件共同组成,这些文件位...原创 2018-10-25 16:14:02 · 1140 阅读 · 0 评论 -
关于Context的理解与总结——什么是Context?
作为一个Android开发者,我们在Android开发中经常会使用到Context这个类。它在加载资源、启动Activity、获取系统服务、创建View等活动中都需要参与。但Context到底是什么,我就很少去关注了…那么我们该如何理解去Context呢?它到底是什么呢?什么是Context翻译角度Context翻译为中文,有:上下文、背景、环境等翻译,我们可以把Context理解成一种环...原创 2018-10-20 11:30:34 · 3541 阅读 · 0 评论 -
Android 轻量级缓存 SharedPreferences 源码解析
本文是独立解析源码的第二篇,SharedPreference 是一个 Android 开发自带的适合保存轻量级数据的 K-V 存储库,它使用了 XML 的方式来存储数据,比如我就经常用它保存一些如用户登录信息等轻量级数据。那么今天就让我们来分析一下它的源码,研究一下其内部实现。获取SharedPreferences我们在使用 SharedPreferences 时首先是需要获取到这个 Shar...原创 2019-06-11 18:13:44 · 339 阅读 · 0 评论 -
十分钟带你读懂轻量级图片加载库Picasso源码
Picasso 源码解析各位好久不见…已经一两个月没更新了…过完年一直在忙着学校的一些事情和项目上的事,就没太多时间写笔记,现在我回来啦。Picasso 是 Square 公司出品的一款十分优秀的开源图片框架,也是目前 Android 开发中十分流行的一款图片加载框架。提到 Square 公司大家一定不会陌生,OkHttp、Retrofit、LeakCanary 等等 Android 开发者...原创 2019-07-05 09:35:46 · 369 阅读 · 0 评论 -
C++ 中的泛型——template浅析
本文出自神农班,神农班宗旨及班规:https://mp.weixin.qq.com/s/Kzi_8qNqt_OUM_xCxCDlKAC++ 的模板是一个比较复杂的领域,在 C++ 中的应用十分广泛,它和 Java 中的泛型有相似之处,但本质上却有非常大的不同。出于好奇,在阿拉神农老师的指导下,写下了这篇文章,对 C++ 的模板进行一系列的学习。模板的引入及意义首先我们来思考一个问题:为什...原创 2019-09-20 14:02:55 · 968 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(七)——请求的发起及响应的读取
终于来到了我们 OkHttp 的最后一个部分——请求的发起。让我们回顾一下 CallServerInterceptor 的大体流程:调用 exchange.writeRequestHeaders 写入请求头调用 exchange.createRequestBody 获取 Sink调用 ResponseBody.writeTo 写入请求体调用 exchange.readResponseHe...原创 2019-08-08 10:15:22 · 1060 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(六)——连接复用机制及连接的建立
当 findConnection 的过程中无法从 transmitter 中取得 Connection 时,会调用 connectionPool.transmitterAcquirePooledConnection 方法来尝试从连接池中获取连接,让我们从这篇文章开始研究一下 OkHttp 中连接池的实现。HTTP 中的复用机制HTTP/1.0在 HTTP/1.0 中,由于 HTTP 协议是一...原创 2019-08-08 10:12:27 · 925 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(五)——路由选择机制
路由选择当我们第一次尝试从连接池获取连接获取不到时,若检查发现路由选择器中没有可供选择的路由,首先会进行一次路由选择的过程,因为 HTTP 请求的过程中,需要先找到一个可用的路由,再根据代理协议规则与目标建立 TCP 连接。Route我们先了解一下 OkHttp 中的 Route 类:public final class Route { final Address address;...原创 2019-08-08 10:09:33 · 717 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(四)——连接的建立概述
前面的文章分析完了 OkHttp 中的缓存机制,现在让我们继续来研究其在 ConnectInterceptor 中所进行的连接建立的相关原理。由于连接建立的过程涉及到很多在 OkHttp 中非常重要的机制,因此将分为多篇文章进行介绍,这篇文章主要是对连接建立的大体流程进行介绍。连接建立流程概述在 ConnectInterceptor.intercept 方法中真正实现了连接的建立的代码如下:...原创 2019-08-08 10:07:08 · 859 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(三)——缓存机制分析
我们知道,在 CacheInterceptor 中实现了 OkHttp 中对 Response 的缓存功能,CacheInterceptor 的具体逻辑在前面的博客已经分析过,但里面对缓存机制的详细实现没有进行介绍。这篇文章中我们将对 OkHttp 的缓存机制的具体实现进行详细的介绍。HTTP 中的缓存我们先来了解一下 HTTP 协议中与缓存相关的知识。Cache-ControlCache...原创 2019-08-08 10:05:09 · 355 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(二)——拦截器大体流程分析
之前的文章介绍到了 OkHttp 的拦截器机制的整体概述,现在让我们依次研究一下其拦截器的实现。RetryAndFollowUpInterceptor前面提到,RetryAndFollowUpInerceptor 负责了 HTTP 请求的重定向功能,那让我们先了解一下 HTTP 协议中的重定向。HTTP 中的重定向HTTP 协议提供了一种重定向的功能,它通过由服务器返回特定格式的响应从而触...原创 2019-08-08 09:57:49 · 360 阅读 · 0 评论 -
OkHttp3.14 源码剖析系列(一)——请求的发起及拦截器机制概述
OkHttp 是一个我从学 Android 开始就接触的网络请求库了,想想现在也陪伴它快两年了,却没有系统性地对它进行过一次系统性的源码解析。因此准备开设这样一个系列,对 OkHttp 的源码进行解析。此篇源码解析基于 OkHttp 3.14OkHttpClient我们都知道,使用 OkHttp 我们首先需要创建并获得一个 OkHttpClient,OkHttpClient 是 OkHttp...原创 2019-08-08 09:55:20 · 470 阅读 · 0 评论 -
同步屏障?阻塞唤醒?和我一起重读Handler源码
大家应该都知道,Android 的消息机制是基于 Handler 实现的。还记得一年前的自己就看了几篇博客,知道了 Handler、Looper、MessageQueue 就自以为自己知道了 Handler 的原理。但其实看源码的过程中慢慢就会发现,Handler 的内容可不止这点, 像同步屏障还有 Handler 的 native 层的实现这些知识以前就没有理解清楚。因此写下此篇文章,从头开始重...原创 2019-07-29 09:23:05 · 456 阅读 · 0 评论 -
为什么说Java的泛型是“假泛型”?
Java泛型Java的泛型是JDK5带来的新特性,它有如下的优点:适用于多种数据类型执行相同的代码泛型中的类型在使用时指定泛型归根到底就是“模版”但是,为了做到向下兼容,Java中的泛型仅仅是一个语法糖,并不是C++那样的真泛型。如何证明呢?我们可以看看下面的例子证明在这个例子中,我们定义了一个List<Integer>集合,我们可以调用add方法向其中加入Inte...原创 2018-10-20 11:29:39 · 4565 阅读 · 2 评论 -
Java的四种引用——强引用、弱引用、软引用、虚引用
众所周知,Java是有四种引用的,分别是:强引用、弱引用、软引用、虚引用。为了学习这些引用之间的区别和联系,写下这篇博客。参考自此博客强引用我们平时用到的最普遍的引用,就是强引用。如果一个对象具有强引用,GC就不会回收它。比如下面就是一个强引用Object o = new Object(); // 强引用当我们内存不足时,Java虚拟机宁愿抛出OutOfMemoryError异常也...原创 2018-10-20 11:28:44 · 233 阅读 · 0 评论 -
设计模式之适配器模式
设计模式之适配器模式参考文章:https://www.jianshu.com/p/9d0575311214定义适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。使用场景用电源接口做例子,笔记本电脑的电源一般都是接受5V的电压,但是我们生活中的电线电压一般都是220V的输出。这个时候就出现了不匹配的状况,我们称之为接口不兼容...原创 2018-09-20 13:15:50 · 266 阅读 · 0 评论 -
Java 多线程总结笔记
Java多线程总结笔记实现多线程的方法查看Thread类的源码,可以发现它实现了Runnable接口,然后在自己的run方法中调用了Runnable的run方法。这里其实就是静态代理这一设计模式,Thread是代理角色,而Runnable则是真实角色。在Thread的start方法中,会为我们开辟新的线程并执行其run方法,而Thread的run方法会调用它内部持有引用的Runnable的ru...原创 2018-09-19 10:21:56 · 4531 阅读 · 1 评论 -
Handler完全解读——Handler原理分析
Handler完全解读——Handler原理分析Android为何设计只能通过Handler机制来更新UI呢?最根本原因:解决多线程并发问题。比如假设在一个Activity中,有多个线程来更新UI,并且都没有加锁,会发生什么情况呢?界面错乱那么如果我们对更新UI的操作都进行加锁的话,又会产生怎样的问题?性能下降基于对上述问题的考虑,Android给我们提供了一套更新UI的机制...原创 2018-09-18 15:55:03 · 310 阅读 · 0 评论 -
Handler完全解读——Handler的使用
Handler完全解读——Handler的使用Handler是什么Handler是Android给我们提供用于更新UI的一套机制,也是一套消息处理机制。我们用它可以发送消息,也可以用它处理消息。在Android开发中有着非常重要的地位。为什么要使用Handler当一个应用程序运行时,它会创建一个进程。这个进程就是我们的主线程(UI线程&Activity Thread) 。在主线程中...原创 2018-09-18 15:52:57 · 7903 阅读 · 0 评论 -
Http协议的简单理解
Http协议的简单理解协议现实生活中的协议:相互遵守,单方面违背则协议不成立。(停战协议、全球贸易协议)互联网中的协议:ftp、http、stmp、TCP/IP、UDP…HTTP协议简介HTTP(Hypertext transfer protocol):超文本传输协议,详细的制定了万维网服务器与客户端间的数据传输的通信规则。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文...原创 2018-09-18 15:47:52 · 6125 阅读 · 0 评论 -
Android属性动画使用浅析
Android属性动画使用浅析简介Android开发中,总是需要一些动画,在UI中达到某种美观的效果,进而提高用户的使用体验。因此,Android为我们提供了一些动画的框架。Android的动画框架分为两类。传统动画(Animation):通过系统不断调用onDraw方法重绘界面,来达到一个动画的效果。属性动画(Animator):通过操纵一个属性的get/set方法,去真实地改变一个属...原创 2018-09-18 15:46:05 · 294 阅读 · 0 评论 -
Android图像处理—图像变换处理探究
Android图像处理—图像变换处理探究此篇博客主要研究了通过各种方式来达到对图像形状变换的效果。矩阵变换基础图像的变换同样可以通过矩阵来实现。下面将介绍 平移变换、旋转变换 缩放变换以及错切变换四种变换方式。1.平移变换当我们要将一个点从x0,y0移动到x,y的时候,可以通过下图的矩阵变换来实现:当如图的矩阵左乘原坐标矩阵后,就会得到一个平移到x,y的新坐标矩阵。2.旋转变换当...原创 2018-09-18 15:40:15 · 304 阅读 · 0 评论 -
Android图像处理—图像色彩处理探究
Android图像处理—图像色彩处理探究本文章主要探究了Android的图像处理中的色彩处理部分的使用RGBA模型RGBA是一种缩写,其含义分别是Red、Green、Blue、Aplha。即红、绿、蓝三原色以及透明度四个选项。我们平时所见到的各种颜色不过是这三原色通过不同的比例混合所得,而alpha则可以控制图片的透明度。下面介绍一些图像处理中重要的三个概念:色调/色相:物体传递的颜...原创 2018-09-18 15:39:23 · 1333 阅读 · 0 评论 -
Android四大组件总结——Service
Android四大组件总结——ServiceService是Android四大组件之一,主要用于在后台处理一些耗时的逻辑,或去执行一些需要长期运行的任务。有时候我们甚至可以在程序退出的情况下,让Service继续保持运行的状态。创建Service要创建Service,我们可以在Android Studio中右键项目栏,选择new-&gt;Service来创建,也可以自己新建一个Java类,继...原创 2018-09-18 15:31:32 · 505 阅读 · 0 评论 -
Android四大组件总结——ContentProvider
Android四大组件总结——ContentProviderContentProvider是Android四大组件之一,主要用于在不同应用间实现数据共享的功能。是Android实现跨程序共享数据的标准方式。ContentProvider的基本使用ContentProvider一般有两种用法,一种是用现有的ContentProvider来读取与操作相应程序的数据。另一种是创建自己的Conten...原创 2018-09-18 15:30:12 · 275 阅读 · 0 评论 -
Android四大组件总结——BoardcastReceiver
Android四大组件总结——BoardcastReceiverBoardcastReceiver是Android四大组件之一,本质上是一个全局的监听器,可以用于组件之间的通信等场景。基本用法1. 创建BroadcastReceiver子类创建一个广播接收器继承于BroadcastReceiver,并重写其**onReceive()**方法。当广播接收器接收到相应的广播,将回调onRece...原创 2018-09-18 15:28:49 · 2377 阅读 · 0 评论 -
EventBus的初步学习及使用
EventBus的初步学习及使用常用的消息传递一个实现了监听器接口的类,必须把它自身注册到想要监听的类中去使用广播,内部实现都需要IPC,传递效率上来说不适合上层组件的通信Activity间的消息传递通过 startActivityForResult 和 onActivityResult,会产生比较多逻辑判断。并且Intent及Bundle传值需要进行类型的检测,易发生错误Event...原创 2018-09-19 10:23:03 · 203 阅读 · 0 评论 -
ListView的使用及打造万能Adapter
ListView的使用及打造万能AdapterListView学习ListView与RecyclerView的不同ListView可以用OnItemClickListener方便地对Item的点击事件作出回应。RecyclerView可以通过LayoutManager实现不同的布局效果。并且可设置横向或纵向滑动ListView本身没有ViewHolder,需要自己写ViewHolder...原创 2018-09-19 10:24:47 · 206 阅读 · 0 评论 -
Okhttp网络框架的基本使用及源码解析
Okhttp网络框架的学习及源码分析HTTP及相关协议HTTP协议出现及发展1960年美国人Ted Nelson提出想法由万维网协会(www)和互联网工程工作共同研究目前使用最广泛的是HTTP1.1HTTP协议结构HTTP协议的结构有四个主要组成部分:请求头表明本次请求的客户端本次请求所使用的cookie(标明本次请求的用户身份)本次请求希望返回的数据类型(json...原创 2018-09-19 10:26:10 · 987 阅读 · 1 评论 -
设计模式之责任链模式
设计模式之责任链模式责任链模式是一种行为模式,它从一个起点发起请求,沿着任务链传递给每个节点的对象,直至有一个节点处理了这个请求。它使得多个对象都有机会来处理请求,避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它。比较类似Android的View的事件分发机制。使用场景可以多个对象处理统一请求,具体谁来处理在运行时动态决定在请求的...原创 2018-09-20 13:14:38 · 244 阅读 · 0 评论