- 博客(70)
- 收藏
- 关注
原创 Java虚拟机:内存区域分配和对象的创建
首先上一张图:这里主要是看右边的图,这张图描述了JVM中的内存分配区域,其中。我们以这张图为准,介绍JVM内存区域分配中的各个区域。
2023-09-21 17:54:00
2
原创 RecyclerView源码解析(四):RecyclerView对ViewHolder的回收
我们最后来总结一下RecyclerView回收ViewHolder的逻辑,首先RecyclerView尝试填充内容时会先尝试从这四级缓存中获取可用的ViewHolder,首先就是从第一级缓存中查找,如果找到了就直接返回;如果第一级缓存中没有可用的Holder,那么接下来RecyclerView还会额外查看是否有不可见但是仍然附加在RecyclerView的View,如果有的话就将其包装成Holder添加进入第一级缓存中,并将其从之前的父RecyclerView中分离,这就是第一级缓存的来源。
2023-09-17 19:04:59
57
原创 开源库源码分析:OkHttp源码分析(二)
上一篇文章中我们已经分析到了OkHttp对于网络请求采取了,所谓责任链模式就是有多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章我们将着重分析OkHttp中这个责任链的行为逻辑。
2023-09-16 17:33:43
388
原创 开源库源码分析:Okhttp源码分析(一)
接下来就要开始分析一些常用开源库的源码了,作为最常用的网络请求库,OkHttp以其强大的功能深受Android开发者的喜爱(比如说我),还有对该库进行二次封装而成的热门库,比如说Retrofit。本文我们将从源码入手看看OkHttp是如何运作的。注意本文解析的是OkHttp3库,该库是用Kotlin写的,需要大家有一些Kotlin基础。
2023-09-15 18:47:20
3082
原创 Android源码解析:Handler机制
关于如何在Android中进行多线程通信,使用Handler机制是一个好方法。Android提供的Handler机制为我们提供了方便的方法进行线程间通信,具体来说,Handler将会绑定一个线程和Looper,Looper将MessageQueue中的Message取出给Handler进行处理。我们可以看一下这幅图先来有一个大概的印象:本篇文章将从源码的角度对Handler机制进行进一步分析。首先我们需要明确一点,那就是Handler机制的设计是基于生产者-消费者模式的。这和Android UI是单线程的也
2023-09-13 14:54:22
63
原创 设计模式:享元模式
首先我们需要简单了解一下什么是享元模式。:主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式的重点就在这个享字,通过一些共享技术来减少对象的创建,实际上Java中String值的存储,Volley中的也使用到了享元模式,这对提高性能很有用。感觉目前大部分的缓存机制都会用到享元模式。
2023-09-11 16:00:53
264
原创 Java:ArrayList源码解析
最后让我们总结一下ArrayList,首先它是一个可以实现自动扩容的容器。它的默认最小容量为10,每当当前容量已经无法容纳下新加入的元素时就会进行扩容。关于扩容,ArrayList会在修改数据存储区之前自增modCount的值,这个值是为了判断线程安全,实现Fast-Fail用的。
2023-09-06 19:12:57
238
原创 RecyclerView源码解析(三):RecyclerView的缓存机制
终于分析完了这个巨长无比的方法了,现在估计还是很疑惑,现在让我们对上面这个过程进行一下总结。最后我光看到了将viewHolder添加进入RecyclerPool而没有看到清除,所以对其源码进行了查看,发现mRecyclerPool是通过ArrayList存储viewHolder,用SparseArray存储与之相关的一些信息,通过这两个容器检查了回收池中指定类型的视图是否已满。如果池已满,就直接返回,不会将视图添加到回收池中。这是为了限制池中视图的数量,以防止占用过多内存。
2023-09-05 21:24:52
68
原创 RecyclerView源码解析(二):结合LinearLayout分析绘制流程
上篇文章中主要已经介绍了RecyclerView的View的三大工作流程(onMeasure,onLayout,onDraw),实际上看了上篇文章还是很迷糊,因为RecylerView由于实现了高度的解耦,所以阅读整个RecyclerView的源码和理解整个RecyclerView需要结合多个相关的类别。根据这段描述,我们也可以了解到上篇文章提到的预布局和实际布局这两个布局过程的作用,预布局将会实现更好的动画效果,因为它记录了新动画开始之前的旧状态,这可以为更合理的动画迭代效果提供更多的信息。
2023-09-04 20:00:45
77
原创 RecyclerView源码解析 (一):RecyclerView之View的工作流程
在Android中如果想要实现一个可滑动的列表,你会怎么做呢?对于我来说,我接触到的第一个列表类的控件就是ListView,其次就是RecylerView。目前来说,ListView已经很少用了,作为JetPack库中一部分,RecylerView显然是主流。可是对于我来说,我只知道实现RecyclerView的最简单的使用,而不了解其原理,在想要实现一些进阶效果时就有心而无力。
2023-09-04 15:14:49
38
原创 Kotlin开发笔记:协程基础
一般来说,我们的函数总是会有一个入口和一个出口。但是协程不同,虽然协程也是函数,但是协程有多个函数的入口,且其会记忆之前调用的状态,并且对协程的调用可以直接跳转到协程的中间,即它在上一次中断的地方。比如说上面这张图,白色的圆点代表的是函数的中断,箭头代表恢复函数的运行。通过两个函数的协作,这显然可以达到并发执行的效果,执行流也在它们之间进行切换。首先,生产者协程调用消费者协程。在执行部分代码之后,消费者保存其当前状态,并返回或让步给调用方。生产者执行更多的步骤,并回调给消费者。
2023-08-27 14:17:12
248
2
原创 Kotlin开发笔记:拓展函数,属性注入以及一些小技巧
本篇文章是全书第12章,关于Kotlin的流畅性的笔记。本章内容比较杂,主要是涉及到使用Kotlin编写出质量更好的代码。本文将介绍Kotlin的拓展函数,属性注入以及一些使用kotlin编程的小技巧🐤。
2023-08-22 21:16:02
57
原创 Kotlin开发笔记:函数式编程
简单来说,我们之前接触到的编程的主流就是命令式编程,我们需要告诉计算机做什么和如何做。而函数式编程的意思就是我们只需要告诉计算机我们想做什么,计算机会帮助我们实现如何做。我们可以看看维基百科的介绍:>在函数式编程中,函数是头等对象即头等函数,这意味着一个函数,既可以作为其它函数的输入参数值,也可以从函数中返回值,被修改或者被分配给一个变量。λ演算是这种范型最重要的基础,λ演算的函数可以接受函数作为输入参数和输出返回值。实际上就是让我们使用封装的函数来进行编程而不需要每时每刻都关心细节的实现,只有我们想
2023-08-20 11:18:15
165
原创 Kotlin开发笔记:集合和逆变协变
首先我们需要介绍逆变和协变的概念,协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。以我的理解,协变应该接近于extend,而逆变接近于super。默认情况下,在Java中泛型强制实行类型不变性–也就是说,如果泛型函数期望一个参数类型T,则不允许替换基类型T或者派生类型T,类型必须是完全预期的类型实际上,在Java中我也没有对通配符和一般的泛型T的区别和相同有什么很深的理解。我的理解是,通配符?
2023-08-18 23:08:13
107
原创 Kotlin开发笔记:使用委托进行拓展
在OO语言(面向对象)中,我们经常会用到委托或者代理的思想。委托和代理在乍一看很相似,其实其各有各的侧重点,这里我引用ChatGpt的回答:委托(Delegation)和代理(Proxy)虽然有相似之处,但在面向对象编程中有一些区别。虽然委托和代理在某些情况下可能会有重叠,但它们的是不同的。。在实际编程中,选择使用委托还是代理取决于具体的需求和设计目标。通过前面的介绍我们应该对代理和委托的概念和区别有了一定的认识。
2023-08-17 17:13:40
202
2
原创 Kotlin开发笔记:类层次结构和继承
与嵌套类不同,内部类的方法和成员的调用是依赖于外部类的实例的,也就是说,如果有一个内部类的实例那就必然有一个外部类的实例。而在Kotlin中没有明确的静态内部类的概念,取而代之的是嵌套类。在Kotlin中的继承是有一层额外的防御机制的,就如同变量要指定val还是var一样,Kotlin中的类也要指定是否可以被继承,一个类在默认情况下是不允许被继承的。我们先来介绍Kotlin中的嵌套类,Kotlin中的嵌套类类似于Java中的静态内部类,嵌套类和外部类的关系较为独立,大部分情况下没有耦合调用的情况。
2023-08-14 19:28:33
243
原创 Kotlin开发笔记:伴生对象和数据类
本章中我们主要介绍了伴生对象和数据类的相关内容。比较重要的就是伴生对象中的内容,主要是用来实现Java中类似于静态成员变量和方法的作用,但是伴生对象又不是简单的静态的。数据类是Kotlin中的一种特殊的模版类,可以方便地实现一些方法。
2023-07-20 14:48:40
81
2
原创 Kotlin开发笔记:外部迭代与参数匹配
在Kotlin中的迭代和Java中的比较大的区别可能就是Kotlin中新增了范围类,通过操作这些范围类我们就可以灵活地遍历了。除此之外,when语句也是kotlin中更加灵活的语句。合理地使用when语句可以大大简化我们的代码,提升简洁性。
2023-07-20 09:42:13
51
原创 Kotlin开发笔记:类型安全和转换
类型安全是编程中非常重要的内容,在实际编程中我们总是会遇到许许多多的空指针异常,类型错误等异常。因此解决好类型安全的问题可以大大提升程序的健壮性。同时Kotlin针对类型安全就引入了许多有用的机制,它将帮助我们走向防御型编程的道路。本篇文章就将介绍关于Kotlin类型安全的相关信息。
2023-07-18 12:59:26
227
原创 Android进阶 四大组件的工作过程(四):ContentProvider的工作过程
本篇是介绍四大组件的最后一篇文章,前三篇文章里我们已经介绍了Activity,Service以及Broadcast的工作流程,那么这篇文章我们就来介绍内容提供器ContentProvider的工作流程。前几篇文章:1. [Android进阶 四大组件的工作过程(一):Activity的工作过程](https://blog.csdn.net/Tai_Monster/article/details/131146284?spm=1001.2014.3001.5502)2. [Android进阶 四大组件的
2023-06-15 22:17:07
699
原创 Android进阶 四大组件的工作过程(三):广播的注册,发送和接收过程
相比Activity和Service的工作过程,Broadcast的工作过程还是比较好懂的,主要就是以AMS为媒介,注册时将接收器注册进AMS中存储接收器的列表中;然后发送过程中也通过AMS来实现发送,调用其存储的接收器的onReceive方法,这样就实现了Broadcast的注册,发送和接收。
2023-06-14 21:25:09
936
原创 Android进阶 四大组件的工作过程(二):Service的工作过程
下面是我总结的一张关于Service工作过程的总结,其中省略了一些细节,主要是帮助理解大致的过程。相信大家也可以发现无论是绑定还是启动,其中都有很多的重合处,无非就是从AMS到ActiviyThread,并且都是通过远程调用的方式。如果要抠细节的话可以看一下AppBindRecord和其他辅助类的关系,这样可以帮助我们更好地理解这整个设计。
2023-06-12 20:19:19
695
1
原创 Android进阶 四大组件的工作过程(一):Activity的工作过程
本系列文章主要是来介绍Android中四大组件的工作过程的,参照书籍为Android进阶解密,主要还是会涉及到源码的阅读。。本篇文章,主要就是来介绍Activity的工作工程的,这里以启动根Activity为例,查看Activity是如何通过系统启动的。这里我们将其分为三个部分来分析,在这之前还是需要介绍一些基础的知识。
2023-06-11 22:02:47
718
原创 Android应用程序进程的启动过程
其实在之前Zygote服务启动的过程中,我们已经提到了这个Zygote服务将会创建出一个Socket来用于给ActivityManagerService使用,应用程序进程的启动就需要ActivityManagerService来给Zygote的服务端发送请求。首先我们介绍ProcessRecord类,这个类是Android系统中用于表示应用程序进程的数据结构。每当应用程序启动时,系统都会为其创建一个ProcessRecord对象来跟踪该进程的状态和信息。具体来说,在ActivityMangerSer
2023-06-10 19:13:46
732
5
原创 Android系统的启动过程(三):Launcher启动过程
前两篇文章中我们已经将系统启动的过程推进到了系统服务启动完毕之后,本篇文章就来介绍Android系统启动的最后一步:启动Launcher。这个Launcher我们可以通俗地理解为桌面,系统启动的最后一步就是启动一个应用程序来显示系统中已经安装完成的应用程序,这个应用程序就叫做Launcher。在 Android 系统启动的最后一步,是启动系统的默认桌面(Launcher)。桌面是用户与 Android 设备交互的主要界面,它提供了应用程序图标、小部件、壁纸等元素,使用户可以访问和启动应用程序。Launche
2023-06-10 15:34:44
1310
原创 Android系统的启动流程(二):SystemServer处理过程
总的来说,这个启动系统服务的过程还是在ZygoteInit类的main方法中调用的,具体是调用了forkSystemServer方法。启动Binder线程池,这样就可以与其他进程进行通信创建SystemServiceManager,其用于对系统的服务进行创建,启动和生命周期的管理启动各种系统服务。
2023-06-08 19:29:57
590
原创 Android系统的启动流程(一):进入Zygote进程的初始化
init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中一个关键的步骤,作为第一个进程,他被赋予了许多重要的工作流程。init进程是由多个源文件共同组成的。首先创建和挂载启动所需的文件目录接着初始化和启动属性服务,设置信号处理函数最后解析init.rc文件,这个过程中将会启动Zygote进程。
2023-06-07 20:40:04
938
1
原创 Android进阶 :实现自定义View
有时候我们会想要实现一些复杂或者是独特的组件效果,这时候系统提供的组件可能不能满足我们的需求,这个时候我们一般就会有两个解决办法,**一是上网查找开源的控件库**,一些流行的开源库可以满足我们的绝大部分需求。不过这些开源库也具有时效性,因为它们的更新得不到保证。二就是我们自己实现我们需要的控件,开源库本质也是自定义View。不过实现自定义View需要我们对View的事件分发以及View的工作流程有一定了解,可以查看之前的博客:1. [Android进阶 View事件体系(一):概要介绍和实现View的
2023-06-01 20:14:35
547
1
原创 Android进阶 View的工作原理:源码分析View的三大工作流程
想象一下,如果我们要画画,把画画的流程拆分的话,那么应该分几个部分呢?一般来说,专业的画师会进行提前构图,然后再进行绘画最后上色。实际上Android系统把各种控件显示到屏幕也相当于是系统在进行绘画,也需要把绘画的过程分为几个大的步骤,这就是View的工作流程。View的工作流程可以分为三个步骤:1. 测量(确定各个控件的大小尺寸和位置)2. 放置(将控件放置到指定位置和大小)3. 绘制(将控件渲染显示出来,这之后我们才能看到)本篇文章就是主要介绍**系统如何绘制各种各样的View控件**的三
2023-05-29 22:21:02
594
原创 Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略
本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里:* [Android进阶 View事件体系(一):概要介绍和实现View的滑动](https://blog.csdn.net/Tai_Monster/article/details/130830213?spm=1001.2014.3001.5501)* [Android进阶 View事件体系(二):从源码解析View的事件分发](https://blog.csdn.net/Tai_Monster/article/details/130871
2023-05-28 17:20:02
1360
原创 Android进阶 View事件体系(二):从源码解析View的事件分发
本篇文章为总结View事件体系的第二篇文章,前一篇文章的在这里:[Android进阶 View事件体系(一):概要介绍和实现View的滑动](https://blog.csdn.net/Tai_Monster/article/details/130830213?spm=1001.2014.3001.5501)本篇文章将专注于介绍View的点击事件的分发,介绍的内容主要有:1. 点击事件的传递原则2. 解析Activity的构成3. 源码解析View的事件分发4. 源码解析View对点击事件的处理
2023-05-26 00:22:24
479
原创 Android进阶 View事件体系(一):概要介绍和实现View的滑动
本篇文章为总结View事件体系的第一篇文章,将介绍的内容主要有:1. 什么是View和ViewGroup2. Android中View的坐标轴3. 手势检测和速度检测4. 如何实现View的滑动## Android中的View与ViewGroup在更加深入地了解Android中View的事件体系之前,我们需要了解究竟什么是Android中的View。在Android系统中,View类是继承于Object,用于构建用户界面的基本块之一。从官网来说:>This class represents
2023-05-24 22:19:57
719
原创 Android:IPC(进程间通信)机制
本篇文章里我们介绍了如何实现IPC,主要有使用AIDL,Bundle传输,使用文件共享和使用ContentProvider四种方法。名称优点缺点适用场景Bundle简单易用只能传输Bundle支持的数据类型四大组件间的进程间通信文件共享简单易用不适合高并发场景,并且无法做到进程间的即时通信无并发访问情形,交换简单的数据实时性不高的场景Messenger功能一般,支持一对多串行通信,支持实时通信。
2023-05-22 22:15:26
425
原创 Android基础复习:Service组件详解
Service组件是一种的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。
2023-05-14 00:30:53
390
原创 Android进阶:Activity的生命周期和启动模式
作为Android四大组件之中存在感最强的组件,Activity应该是我们在学习Android中第一个碰到的新概念。在日常开发过程中我们肯定会用到Activity,今天我们就来详细说明Activity的生命周期和启动模式。在本篇文章中,将会介绍以下比较具体的内容:1. context对象是什么2. 什么是失去焦点和不可见3. Activity的生命周期4. 异常状态下该如何处理Activity的重新创建5. 什么是任务和任务栈6. 五种启动模式和任务亲和性7. 清除返回堆栈
2023-05-08 19:25:16
519
原创 Android进阶之光:Dagger2原理简要分析
正是我们自己写的实例提供者。我们先来看前面有关Builder的方法,由于我们在Activity的Component注解中添加了modules和dependencies的值,所以在builder中就会生成响应的gsonModule(GsonModule gsonModule)和swordmanComponent(SwordmanComponent swordmanComponent)方法,这两个方法分别是用来设置生成的注入器中的gsonModule和swordmanComponent对象的。
2023-05-02 18:07:34
1408
3
原创 EventBus(事件总线)的使用和源码的简单解析
事件总线(EventBus)是一种广泛用于软件架构中的设计模式,用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信,以提高应用程序的可维护性、可扩展性和灵活性。在事件总线模式中,不同的组件通过订阅和发布事件来进行通信。发布者发布一个事件,订阅者可以订阅该事件并在事件发生时执行相关的操作。事件总线充当了中介者的角色,它负责管理所有的事件和订阅者,并确保事件正确地传递到所有订阅者。事件总线模式可以在很多场景中使用,例如 Android 应用程序中的通信、分布式系统中的消息
2023-04-29 20:08:53
756
2
原创 Retrofit入门使用
*这里我们可能会有疑惑,Retrofit的回调方法中可以使用Toast吗,实际上是可以的,虽然Retrofit是基于Okhttp的,但是它与Okhttp不同,它的回调方法中是可以直接刷新UI的,因为其是通过Handler与主线程绑定的,所以会在主线程里执行。在Retrofit中,@Query注解是用来标记一个请求参数的,它可以添加到一个方法的参数中,指定这个参数是用来作为请求URL的查询参数的。,即Call的泛型,我这里传入的ReModel类是一个GSON的数据类,就是用JSON解析时需要传入的模板类。
2023-04-21 19:30:58
134
2
原创 Kotlin开发笔记:类的创建,单例和匿名对象
*在次构造函数中,我们是不允许用val或者var修饰符来修饰传入的参数的,也就是说,在次构造函数中,我们不允许自动创建字段。这段代码先定义了一个成员变量address并先将其初始化为"",紧跟在后面的是它的set方法,定义一个变量的set或者get方法的格式就是紧跟在成员变量之后,用set代码块或者get代码块。在drawCircle方法中,我们通过object关键字生成了一个匿名类,该匿名类拥有x,y,radius三个成员变量,在这个方法中可以访问匿名类的字段。init块的执行顺序是自上而下的。
2023-04-18 20:52:27
204
原创 Android开发笔记:Volley完整源码解析
Volley 是一个可让 Android 应用更轻松、(最重要的是)更快捷地联网的 HTTP 库。您可以在 GitHub 上获取 Volley。Volley 具有以下优势:自动网络请求调度。多个并发网络连接。透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。支持请求优先级。取消请求 API。您可以取消单个请求,也可以设置要取消的请求的时间段或范围。可轻松自定义,例如自定义重试和退避时间。强大的排序功能,让您可以轻松使用从网络异步提取的数据正确填充界面。调试和跟踪工具。
2023-04-17 20:26:16
192
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人