自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ZH的博客

路漫漫其修远兮,吾将上下而求索。

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

原创 属性动画与硬件加速

在屏幕显示的时候,GPU拿着cpu的指令,直接转换为像素应用到屏幕上,显示文字,图形等元素。本文根据动画常见的使用场景,详细总结一下Android中各种属性动画的区别和特点,以及制作复杂动画所用到的关键帧、插值器、估值器的原理、使用场景和方法。view的绘制是非常频繁的操作。为了性能考虑,android每次绘制信号到来(就是我们常说的VSync信号),并不会整个界面,只绘制改变了的区域。它的主要原理是,这些view自带的属性,被android做了优化,这些属性的改变,不会导致gpu操作的改变。

2024-06-23 21:43:26 534

原创 Grdle构建原理分析

它的作用是包住gradle,实际上做工作的是它里面的gradle。java语言提供匿名内部类和lamda表达式的形式来传递方法,它实际上传递的是类的对象,而不是方法本身。前面说的buildType flavorDimensions生成的变体,实际上是通过插件根据配置创建出不同的task(后面准备分享一票Android apk编译打包的过程,这里再详细进行介绍)。事实上,老的版本Gradle只提供compile方法,新的版本提供了非传递依赖的implementation方法和传递依赖的api方法。

2024-06-23 21:40:21 758

原创 (三)OkHttp网络请求拦截器详解

这个拦截器一般做网络调试用,用户自定义,插在连接拦截器和请求服务拦截器之间。整个OkHttp的网络请求工作都是在这个五大拦截器中完成。他们分别负责不同的工作,如果流水线一样,经过五到工序,最终完成了完整的工作。

2023-08-06 08:54:05 2409

原创 (二)OkHttp网络请求配置参数详解

前面说到OkHttp网络请求的总体框架。这一章节主要通过解读OkHttpClient的内容,了解可以通过框架配置哪些参数,以及这些参数的意义。让我们对OkHttp框架和HTTP协议之间的关系有更深的了解。

2023-08-06 08:50:03 2849

原创 (一)OkHttp网路请求框架详解

前面几篇文章讲解了HTTP相关的技术知识。接下来将看一下OkHttp是如何使用HTTP的相关技术,完成网络请求。如果没有看过之前HTTP的内容,建议先看一下再来看本章的内容。本文是介绍OkHttp的第一章节----OkHttp的网络请求框架。

2023-08-06 08:46:10 986

原创 View的加载和更新流程

本文主要讲解View的完整加载过程和View的更新流程。

2023-08-06 08:44:47 411

原创 Git深入理解与常用操作的本质

Git当前十分流行的版本管理系统(VCS)。它是一种分布式的VCS,即Git的每一个仓库都具有完整的内容和功能,可以独立运行。基于分布式的特性,Git可以在任意位置clone代码仓库,进行开发和提交。使得对代码的管理十分方便。本文对Git涉及的主要概念以及经常会用到的Git命令进行讲解。帮助大家更好的理解、掌握和使用Git。本文篇幅较长,请耐心阅读。

2023-05-20 09:30:15 284

原创 Dagger2实现原理分析

Dagger是一个依赖注入框架,这个框架往往给人一种“高端,但是却很难用“的感觉。我们在使用或者阅读别人的项目时,往往会陷入dagger搭建的”迷宫里”绕不出来。导致Dagger被认为是android史上”最受冷落的优质库”。本文先通过理清依赖注入的概念,然后详细介绍Dagger一些常见的使用场景和注意事项,最后介绍一下Dagger主要功能实现的原理。帮助大家进行理解。

2023-05-20 09:20:02 923 1

原创 HTTPS安全通讯原理解析

对于敏感数据我们通常会选择用HTTPS进行加密传输。HTTPS和HTTP有什么关系?它是如何实现数据安全传输的?现在就带你研究。

2023-03-04 14:12:25 170

原创 一文读懂TCP/IP网络分层模型

网络模型有国际标准化组织定义的OSI七层网络模型和实际使用的TCP/IP五层网络模型。本文从应用开发的角度介绍TCP/IP网络模型,帮助大家更好的理解。

2023-03-04 14:11:19 498

原创 HTTP登录和授权

HTTP是无状态的协议,它不会记录和保存之前连接的状态。那么它进行登录验证和授予客户端权限的过程是怎样的?我们经常使用微信、QQ等进行第三方的授权登录。又是怎样实现的?本文将通过介绍HTTP登录和授权机制帮助大家理解这些问题。

2023-03-04 14:10:07 1379

原创 网络安全签名与认证

网络安全的签名与认证是非常实用的技术知识,但是了解的人比较少。因为相关的内容基本都有成熟的解决方案,很少需要我们做什么。这些东西经常被用到,需要真正理解才能更好和更正确的使用。这里把相关的内容整理出来,帮助大家更好的掌握。

2023-03-04 14:06:27 768

原创 HTTP工作方式与报文解析

HTTP是我们在开发工作中经常接触而又容易被忽视的知识点。它经常是“一次配置,终身使用”。即在第一次被搭建起来,后面基本不会再动它。前端、后端,以及前后端交互的代码都已经定型。而我们只需要按照之前的规则来对他进行扩展。这就导致了我们经常使用,但对它又并不是很了解。本文将通过介绍HTTP协议的定义、工作方式,以及请求报文和响应报文的解析,帮助大家更好的理解HTTP协议。

2023-03-04 14:04:25 885

原创 Java原生网络编程 ---- IO多路复用

Java是在jdk1.4引入支持NIO的库。前面博客说过BIO通讯,这种模式下服务端一个线程只处理一个会话。当线程被阻塞在read() 或 write()时,不能够做其他的事情。线程在服务器属于比较昂贵的资源。BIO的方式会造成很大的资源浪费。NIO,被称为IO多路复用,中心思想既是对服务器的线程进行复用,从而提高服务器资源利用的效率。

2022-05-14 17:00:00 1820 1

原创 Java原生网络编程 ---- 阻塞式IO

阻塞式IO,即BIO。采用BIO通信的服务端模型,通常由一个独立的Acceptor线程负责监听客户端的连接,当收到一个客户端连接请求后,为该客户端创建一个线程进行会话,包括数据的读取、写入以及处理等,会话完成后销毁线程。这是一种“一请求一应答”的模型,即一个线程处理一个会话。

2022-05-14 13:00:00 385

原创 HTTP协议简介

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,用于从万维网服务器传输超文本到本地浏览器。(本地浏览器通过解析超文本从而在本地浏览器显示内容)。HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地...

2022-05-14 10:00:00 733

原创 TCP协议

TCP(Transmission Control Protocol)是面向连接的可靠的通讯协议。TCP需要经过三次握手建立连接,并在断开时通过四次挥手释放连接。TCP通过应答确认、超时重传(RTO)、往返时延(RTT)、数据排序、流量控制、全双工通讯的机制和特性,保证连接的可靠性。

2022-05-13 01:15:00 1993

原创 Java原生网络编程基础

计算机网络,是利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。

2022-05-12 23:45:00 75

原创 Java外置锁实现原理

Java中的锁,如,ReentrantLock(显式锁)、CountDownLatch(闭锁)等都是基于AQS(队列同步器)来实现的,AQS又是CLH队列锁的一种变体实现。下面对这些锁的知识进行详细介绍。

2022-05-12 02:15:00 102

原创 CAS原理与无锁化编程

在前面的博客“sychonized锁升级机制”中提到过CAS自旋锁。他的全称是Compare And Swap,翻译成“比较和交换”。是一种轻量级的基于轮询的并发工具。CAS原理CAS操作过程都包含三个运算符:一个内存地址V,一个期望的值A和一个新值B。操作的时候,如果该地址上存放的值等于这个期望的值A,则将地址上的值赋为新值B;如果地址上的值和期望值A不相等,则不进行操作,从新获取旧值A和计算新值B后,再次进行上述操作。如此循环直到操作成功位置。在这个过程中,比较...

2022-05-12 00:30:00 228

原创 并发编程工具 ---- 阻塞队列

阻塞队列,是只支持阻塞方式插入、移除方法的队列。支持阻塞的插入,即是当队列满时,队列会阻塞插入元素的线程,直到队列不满;支持阻塞的移除,是在队列为空时,获取元素的线程会阻塞等待队列变为非空。队列队列是线性表的一种,但是他是一种受限的线性表,只允许在表的前端(front)进行删除操作,又称为出队;在表的后端(rear)进行插入操作,又称为入队。进行插入的一端称为队尾,进行删除的一端称为队头。队列的这种特性,导致最早进入队列的元素最先从队列中删除,因此队列又称为先进先出(...

2022-05-11 02:00:00 98

原创 线程池工作原理

Java的线程池是当前应用最普遍的一种并发框架。在并发编程中,合理的使用线程池能够带来一系列的好处。1、降低资源消耗。线程池通过重复利用已创建的线程,从而降低线程创建和销毁的开销;2、提高响应速度。当任务到达时,任务可以不用等待创建线程,利用现成的线程资源就能立即执行。例如,完成一项任务需要时间分为:T1线程创建的时间,T2在线程中执行的时间,T3线程销毁的时间。线程池通过把T1、T3安排在空闲的时间执行。在有任务提交过来时,只消耗了T2执行任务的时间...

2022-05-11 00:45:00 1369

原创 ThreadLocal实现原理

ThreadLocal和其他并发工具一样,也是用于解决多线程并发訪问。ThreadLocal通过为每个线程都提供了变量的副本,使得每个线程在同一时间访问的并非同一个数据,从而隔离了多个线程对数据的数据共享。ThreadLocal的使用ThreadLocal 类接口只提供了4个方法:public void set(Object value),设置当前线程的线程局部变量的值。public Object get(),该方法返回当前线程...

2022-05-10 01:00:00 2613

原创 Volatile关键字与可见性问题

Java内存模型(JMM)Java内存模型,既是定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。其中,JMM隶属于JVM。JMM主要解决的问题,是处理cpu处理速度和内存存取速度极度不平衡的问题。以下数据摘自《Jeff Dean在Google全体工程大会的报告》。根据表格中的数据,计算从内存中读取1M的int型数据由CPU进行累加的耗时情况。Java里int型为32位,4个字节,1M数据共有1024*1024/4 = 262,144个整数 ,CPU...

2022-05-10 00:15:00 126

原创 Synchronized实现原理与锁升级机制

并发编程,要求线程之间能够相互配合以完成工作。这就涉及到数据共享和线程协作。 Java支持多个线程公式访问同一个对象的方法和成员变量,而关键字synchronized的作用则是确保多线程在同一时刻,只能有一个线程访问synchronized所修饰的方法或同步块,确保线程访问的排他性。 synchronized是内置在对象头的MarkWork字段。对象头的构成在我的"Jvm对象创建过程"博客中有详细说明。因此,它又被称为内置锁。对象锁和类锁...

2022-05-01 00:24:20 1877

原创 Java多线程基础

进程与线程

2022-04-30 00:15:00 767

原创 Java高级语言特性 ---- 反射

Java反射机制是一种运行期的行为,即是在运行时,能够知道任意一个类的所有属性和方法;访问任意一个对象的任意属性;调用任意一个对象的任意方法。它是Java被视为准动态语言的关键特性。Java反射机制主要提供以下功能: 1、在运行时构造任意一个类的对象; 2、在运行时获取或者修改任意一个类所具有的成员变量和方法;3、在运行时调用任意一个对象的方法和访问对象的属性。Class对象反射始于Class对象,它是类类型的对象,...

2022-04-27 10:58:52 201

原创 Java高级语言特性 ---- 泛型

泛型是jdk1.5开始引入的特性。泛型既是参数化类型,理解为将参数的类型作为参数。泛型可以作用在类、接口和方法上。分别称为泛型类、泛型接口和泛型方法。使用泛型的好处有:1、适用于多种数据类型执行相同的代码;2、获得编译期的类型安全,以及运行时更小的抛出ClassCsstException的可能。“适用于多种数据类型”,即是参数类型指定为泛型,在实际使用中根据需要传入具体的类型。例如下面代码:// 定义一个泛型方法,接收T类型参数,T既是泛型public <T...

2022-04-26 15:22:32 200

原创 Java高级语言特性 ---- 注解

Java注解是JDK5.0引入的。它是元数据的一种形式,提供有关程序而不属于程序本身的数据。注解默认实现Annotation接口(这一点类似于java类默认都继承自Object)。声明一个注解用@Interface关键字。// Java lang包下的 Annotation.javapackage java.lang.annotation;public interface Annotation { boolean equals(Object var1); int...

2022-04-24 11:26:37 855

原创 Android 序列化 ---- Parcelable原理分析

Parcelable是专门为Android设计的序列化接口。它是基于内存,底层是通过指针挪动实现。因此,执行效率比Java的Serializable要高的多,号称快10倍。一个简单的使用Parcelable进行序列化的例子:public class ParcelObj implements Parcelable { private String strField; private int intField; // 需要提供一个接收 Parc...

2022-04-21 21:47:56 4681

原创 Java序列化(3)---- Serializable反序列化原理

反序列化过程调用ObjectInputSream类的readObject方法对实现了Serializable的对象进行反序列化。public SerialObject inputObj(String path) throws Exception { ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(path)); SerialObject obj = (SerialOb...

2022-04-20 20:39:58 624

原创 Java序列化(1)---- Serializable序列化的使用

序列化是将对象转换为二进制数据的过程。目的是便于传输。简单使用实现一个简单的序列化类,需要注意如下几点: 1、需要序列化的类,需要实现Serializable接口; 2、用transient关键字修饰的成员变量不参与序列化,在被反序列后,该成员变量被赋予初始值,如 int 型的值是 0,对象类型的为 null; 3、静态类型的变量,不属于对象的成员,不会参与序列化; 4、用serialVersio...

2022-04-19 21:04:50 824

原创 Java序列化(2)-- Serializable序列化原理分析

序列化和持久化序列化和持久化都是将对象转换成二进制数据,序列化的目的是便于传输,而持久化的目的是进行存储。持久化必须要进行序列化,而序列化不一定要进行持久化。反序列化,既是将二进制数据还原成为对象的过程。Serializable接口Java的序列化和反序列化,需要通过ObjectOutputStream和ObjectInputStream这两个类实现。继承自Serialable接口,表示当前类可以被ObjectOutputStream序列化,以及可以被Obj...

2022-04-18 20:50:21 721

原创 Jvm垃圾回收机制

对象访问定位方式Jvm通过栈上的reference来操作堆上的对象,主要有两种方式:句柄和直接指针。句柄Java堆中划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。直接指针reference中存储的就是对象地址。使用句柄的优点是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中...

2022-04-15 21:49:05 565

原创 Jvm对象创建过程

jvm创建对象主要经过检查加载、分配内存、内存空间初始化、设置对象头、初始化对象几个阶段。检查加载 检查类是否已经被加载、解析和初始化过。虚拟机遇到一条new指令时,首先检查是否被类加载器加载。如果没有,则执行相应的类加载过程。类加载就是把class加载到JVM的运行时数据区的过程。如果有多个线程,只会有一个线程完成类加载。JVM保证类加载是线程安全的。分配内存 类加载无误后,开始为对象分配空间。即把一块确定大小的内存从Java堆...

2022-04-15 20:38:19 3306

原创 JVM 运行时内存

JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。JVM的特点是,跨平台、跨语言。跨平台:不同操作系统有不同的JDK的版本实现跨平台。跨语言:JVM只识别字节码(class文件),所以JVM跟语言是解耦的。除了java还有像Groovy 、Kotlin、Jruby等语言,也是编译成字节码,在JVM上面跑,所以JVM是跨语言的。JRE、JDK的关系

2022-04-14 21:05:33 494

空空如也

空空如也

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

TA关注的人

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