自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 注解处理器

注解处理器(APT):javac 的一种处理注解工具,用来在编译期扫描和处理注解,通过注解来生成 Java 文件,它只能生成新的源文件而不能修改已经存在的源文件。通过这种方式,可以让我们编程中减少很多的代码,解放生产力。...

2022-08-02 00:40:28 1510

原创 Retrofit源码解析

本文分析的源码基于retrofit:2.9.0。前言Retrofit基于OkHttp,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装,它们的关系示意图如下:基本使用首先添加依赖 // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit的Gson转换器 implementation 'com.squareup.retro.

2022-01-21 13:37:34 2101 2

原创 Kotlin协程实现原理

初看suspend关键字下面的例子模拟一个网络请求:class Temp { suspend fun fetchData(argument: String): Boolean { val result = netRequest(argument) return result == 0 } // 模拟网络请求 suspend fun netRequest(argument: String): Int { delay(1000

2022-01-19 19:44:24 2825

原创 Kotlin协程的使用

前言本篇是在Android官网对Kotlin协程的学习记录。记录Kotlin Coroutines在Android上的特点、应用等协程概述一、协程是什么?协程是一种并发的设计模式,可以使用它来简化异步执行的代码,它可以帮助管理一些耗时的任务,以防耗时任务阻塞主线程。协程可以用同步的方式写出异步代码,代替了传统的回调方式,让代码更具有可读性。二、协程的特点?轻量(Lightweight):其实这里的轻量是相对线程阻塞而言的,协程支持挂起,挂起的时候并不会阻塞当前线程,也就是"非阻塞式挂起",在

2022-01-19 19:38:40 6176 3

原创 【并发】锁

《Java并发编程的艺术》读书笔记锁的作用锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。Lock接口在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。Lock接口与synchronized关键字相比:缺点:缺少了隐式获取释放锁的便捷性优.

2022-01-15 01:57:59 483

原创 【并发】Java内存模型

《Java并发编程的艺术》读书笔记通信与同步并发编程,需要处理两个关键问题:线程之间如何通信线程之间如何同步「通信」是指线程之间以何种机制来交换信息,线程之间的通信机制有两种:共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信消息传递:线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信「同步」是指程序中用于控制不同线程间操作发生相对顺序的机制若采用"共享内存"的通信机制,同步是显式进行的,程序员必须显式指定某个方法或某段代码需要在线程之间互.

2022-01-15 01:53:11 139

原创 探索OkHttp系列 (七) 自定义拦截器

前言在前面的文章中,我们介绍完了所有OkHttp自带的拦截器,再回顾一下整个拦截器责任链图:在整个拦截器责任链中,用户还可以添加自定义的拦截器,有两个位置可以添加,对应的方法分别是:OkHttpClient.Builder::addInterceptor方法 fun addInterceptor(interceptor: Interceptor) = apply { interceptors += interceptor }OkHttpClient.Builde

2021-12-19 00:53:09 682

原创 探索OkHttp系列 (六) 发起请求与获取响应

前言接下来我们要分析的是拦截器链上的最后一个拦截器CallServerInterceptor,它用于写入请求与获取响应,这里不需要再调用拦截器责任链的proceed方法,CallServerInterceptor在intercept方法中将自己的工作做完后,就直接将响应返回给上一拦截器。CallServerInterceptor::intercept @Throws(IOException::class) override fun intercept(chain: Interceptor.Cha

2021-12-19 00:51:53 1777

原创 探索OkHttp系列 (五) 连接建立与复用

前言上一篇文章我们介绍了CacheInterceptor拦截器,这篇文章我们要介绍的拦截器是ConnectInterceptor,该拦截器的作用是获得一个健康可用的与目标服务器的连接,然后就将请求交给下一个拦截器处理。该拦截器的内部实现非常的复杂,涉及到OkHttp许多的机制,例如路由选择机制、连接的建立与复用机制,我们在下面的分析中,先对其大体流程进行分析,然后再一个一个点地深入分析,逐个突破。ConnectInterceptor::interceptConnectInterceptor::int

2021-12-19 00:27:12 1381

原创 探索OkHttp系列 (四) 缓存机制

前言上一篇文章,我们介绍了BridgeInterceptor,这一篇文章我们就来介绍CacheInterceptor,它与OkHttp的缓存机制有关。在介绍OkHttp的缓存机制之前,我们先来了解下Http的缓存机制。Http的缓存机制缓存主要指代理服务器或客户端的磁盘中保存的资源副本,通过缓存可以减少向源服务器的访问,从而提高效率。缓存规则为方便理解,我们认为客户端存在一个缓存数据库,用于存储缓存信息,并且不考虑代理服务器的存在。在客户端第一次请求数据时,此时缓存数据库中没有对应的缓存数据,

2021-12-19 00:18:10 623

原创 探索OkHttp系列 (三) 请求与响应的转换

前言上一篇文章,我们介绍了RetryAndFollowUpInterceptor拦截器,该拦截器的下一个拦截器就是BridgeInterceptor,本篇文章我们就对BridgeInterceptor进行一个介绍。从BridgeInterceptor的名字可以看出,它起的是一个桥接的作用:将用户构造的请求转换为发送给服务器的请求,请求转换的过程就是添加一些服务器端需要的header信息将服务器的响应转换为对用户友好的响应,响应转换的过程就是进行gzip解压BridgeInterceptori

2021-12-19 00:14:05 706

原创 探索OkHttp系列 (二) 错误重试与重定向

前言在上一篇文章「探索OkHttp系列 (一) 请求的发起与响应」,我们介绍了请求的发起与响应的整个过程,在介绍请求响应的时候,最关键的点是拦截器机制与责任链模式,关于责任链模式在请求的响应中是如何运用的,我们已经在上篇文章讲述了,但是上篇文章没有去详细地介绍各个拦截器的作用,从这篇文章开始,我们就一一地介绍各个拦截器。拦截器的工作流程如下:如果用户没有加入自定义的拦截器,那么 RetryAndFollowUpInterceptor 就是我们的责任链中最先被调用的拦截器,我们这篇文章就从RetryA

2021-12-19 00:12:23 1436

原创 探索OkHttp系列 (一) 请求的发起与响应

前言OkHttp是个人使用的比较多的网络请求库,但是一直没有探究它的实现原理,这次就对OkHttp的源码进行分析,探究其实现原理。分析的okhttp源码版本:4.9.2。基本使用GET同步地发起请求,会阻塞线程,不能直接在主线程当中调用 private fun getData() { thread { val client: OkHttpClient = OkHttpClient() val request: Request

2021-12-19 00:09:56 905

原创 应用程序进程启动过程

分析的源码基于android-8.0.0_r4《安卓进阶解密》读书笔记应用程序进程启动过程在「Android系统启动」笔记中提到,Zygote进程中会有一个Server端的Socket,等待AMS请求"创建新的应用程序进程",这里会将「AMS请求」与「Zygote进程响应,创建应用程序进程」这两部分联系起来。因为应用程序进程由Zygote进程Fork而来,所以应用程序进程可以获得Zygote进程在启动时创建的虚拟机实例。AMS发送请求时序图如下AMS的startProcessLocked.

2021-12-17 10:45:59 563

原创 根Activity的启动过程

《安卓进阶解密》读书笔记这里分析的源码基于android-8.0.0_r4.「根Activity的启动过程」和「Activity的启动_5.0」笔记记录的,有大部分过程是一样的.概述根Activity启动过程中设计到的进程及其交互时序图如下这里将根Activity的启动划分为四部分Launcher请求AMS过程AMS判断根Activity所需的应用程序进程是否已经存在并启动,若不存在,则请求Zygote进程创建应用程序进程,详情查看《应用程序进程启动过程》的笔记。应用程序进程启动后.

2021-12-17 10:42:50 1110

原创 Android系统启动

分析的源码基于android-8.0.0_r4《安卓进阶解密》读书笔记Android系统启动在Android系统启动的流程中,主要介绍下面几点init进程启动过程Zygote进程启动过程SystemServer进程启动过程Launcher启动过程其中,init、Zygote、SystemServer进程启动的关系密切,这里先给出流程图Launcher启动的部分时序图如下init进程启动过程init进程是Android系统中用户空间的第一个进程,进程号为1在init进程.

2021-12-17 10:27:04 1557

原创 Activity的启动_5.0

源码分析基于 Android 5.0.0_r2这里分析Activity的启动,沿着思路:在一个app的已有的Activity之上,启动另外一个Activity,这两个Activity属于同一个app、同一个进程整体流程相关类介绍Instrumentation:仪表盘,具体到应用程序中是管理Activity的一个工具类,包括创建和启动Activity,Activity的生命周期方法都是由Instrumentation来控制的,一个进程只用一个Instrumentation实例ActivityMa

2021-12-16 19:48:51 359

原创 ViewModel浅析

本篇文章不关注ViewModel是如何使用的,主要讨论的是ViewModel的原理以及它是如何创建的ViewModel的创建我们在创建ViewModel的时候,有多种方式,比如,我们可以直接调用它的构造方法val model = MyViewModel()我们也可以使用下面的方法来创建val model = ViewModelProviders.of(this).get(MyViewModel::class.java)注意,使用ViewModelProviders需要导入下面的依赖im.

2021-12-15 14:56:33 1810

原创 JVM_虚拟机执行子系统

本篇为《深入理解Java虚拟机 第3版》读书笔记文中,《Java虚拟机规范》简称《规范》类文件结构平台无关性和语言无关性的基石:Java虚拟机和字节码存储格式平台无关性:Java虚拟机可以运行在各种不同的硬件平台和操作系统上,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现程序的“一次编译,到处运行”语言无关性:Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集、符号表以及.

2021-12-14 21:35:53 996

原创 JVM_自动内存管理

本篇为《深入理解Java虚拟机 第3版》读书笔记文中,《Java虚拟机规范》简称《规范》内存区域与内存溢出异常运行时数据区域程序计数器字节码解释器工作时,通过改变这个计数器的值,来选取下一条需要执行的字节码指令程序计数器特点每条线程有一个独立的程序计数器「即线程私有」执行Java方法,计数器记录正在执行的虚拟机字节码指令的地址;执行Native方法,计数器的值为空内存区域中,唯一一个《规范》中没有规定任何OutOfMemoryError「OOM」情况的区域虚拟机栈Java.

2021-12-13 20:58:25 800

空空如也

空空如也

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

TA关注的人

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