自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 后端学习笔记:Python基础

Python中用def来声明一个函数。Python中的函数定义比较简单(因为它是脚本语言),只要确定函数名和参数列表即可,Python 采用鸭子类型哲学,即只要一个对象具有所需的方法或属性,就可以使用它,而不关心对象的具体类型。这种方式让代码更加灵活和通用。sayHello()在上述片段中,函数就可以返回四种类型的参数。

2024-06-20 20:45:14 930

原创 Android:弹出对话框方式梳理一览(一)

到之前为止其实都是Dialog的很基础的应用,实际上在使用过程中我们可能需要弹出一个Dialog来展示我们自己的定制化的内容,比如说一个登录页面,这个时候我们就不能用之前的简单的方法了,取而代之,我们可以调用setView方法来为我们的Dialog填充自定义的内容,这个过程实际上类似于动态添加View的过程。

2024-05-06 20:28:37 1196

原创 [Android View] 可绘制形状 (Shape Xml)

形状可绘制对象是一种在 XML 文件中定义的通用形状。我们通过xml来描述图形,可以减少图片资源的引入,达到减小包体积的目的。

2024-02-29 15:14:09 1414

原创 [Android]实现一个权限申请类

在引入了动态权限申请之后,Android的权限申请就变得尤为繁琐,若是按照原有的方法一板一眼地进行申请,样板代码未免太多。因此本篇文章就使用ActivityResult API,来实现一个简单的权限申请类来帮助我们简化权限申请的过程。。

2024-01-16 17:05:20 1231

原创 [Android自定义View]实现一个环形进度条控件

之前的文章里我们已经介绍了自定义View相关的知识了,本篇文章我们就来实战一下,从零到一,实现一个环形进度条的控件。

2024-01-11 18:16:31 1059

原创 数据结构与算法:二叉树(一)

其实所谓二叉树,是形如以下的数据结构:即,通过一个节点可以访问到其他的两个节点。其中,一号节点被称之为根节点,二三号节点被称之为一号节点的叶子节点。//当前二叉树节点的值int val;//当前二叉树节点的左节点//当前二叉树节点的右节点这就是一个最简单的二叉树节点的结构;其实按照我的理解来说,二叉树节点与链表的区别就是其多了一个指针域可以指向别的节点,在很多时候二叉树和链表有许多相通之处。

2023-11-14 19:54:22 174

原创 使用非递归的方式实现归并排序

使用非递归的方式实现归并排序

2023-11-10 18:02:35 207

原创 设计模式大赏(一):桥接模式,组合模式

本篇文章是设计模式大赏中的第一篇文章,这个系列的文章中我们主要将介绍一些常见的设计模式,主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要介绍和这两种设计模式。本篇文章主要参考:《大话设计模式》

2023-10-29 17:46:49 414

原创 Android:窗口管理器WindowManager

实际上Android上的窗口指的并不是具体的手机窗口而是一个抽象的概念,它本质上也是一个View,我会把窗口理解成一组有关联的View。与与的关系类似,中方法的实现也是通过远程调用。

2023-10-28 19:26:03 1257

原创 JVM:虚拟机类加载机制

众所周知,Java是面向对象编程的一门语言,每一个对象都是一个类的实例。所谓类加载,就是**JVM虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。** 动态的类型加载也是Java语言的一个重要特性之一,比如Android中的Retrofit库的动态代理在一定程度上也依赖于动态的类型加载

2023-10-14 18:41:01 399

原创 Android 源码解析: SharedPreferences的解析

SharedPreferences是Android中的一种轻量的数据持久化手段,可能也是我们在学习Android时接触到的第一种特殊的本地数据持久化手段,本篇文章就将从源码角度分析SharedPreferences的原理。

2023-10-09 18:55:20 312

原创 Android Jetpack组件架构:ViewModel的原理

本篇文章是关于介绍ViewModel的,由于ViewModel的使用还是挺简单的,这里就不再介绍其的基本应用,我们主要来分析ViewModel的原理。

2023-09-26 17:51:48 925

原创 Android Jetpack组件架构 :LiveData的使用和原理

继Lifecycle组件之后我们接下来要介绍的就是LiveDate组件,所谓LiveDate字面意思上就是有声明的数据,当数据有改动时该组件可以感知到这个操作并将该事件通知到其观察者,这样我们就可以在观察者中做出一些处理,一般都是用来更新UI的操作。这样就实现了当数据改变时U界面自动更新的效果。

2023-09-25 23:02:49 930

原创 Android Jetpack组件架构:Lifecycle的使用 和 原理

作为Jetpack中关于生命周期管理的核心组件,Lifecycle组件是其他比如LiveDate和ViewModel等组件的基础,本篇文章主要就将介绍关于Lifecycle的使用和它的运作原理。

2023-09-23 22:35:36 381

原创 Android开发笔记 :理解Fragment

本篇文章产生的原因很简单,就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为的Fragment来跟踪的,为了更好的了解Fragment是如何追踪Activity生命周期状态的变化我们有必要对Fragment组件进行更深入的探讨。

2023-09-23 20:24:13 322

原创 Android中的缓存策略:LruCache和DiskLruCache

本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存,就是将获取的数据保存下来以便下次继续使用,这种技术尤其在网络请求和图片加载中有用,可以显著地提升App的性能表现。Android中也内置了两个缓存类,分别是和。

2023-09-22 21:12:15 716

原创 Java虚拟机:内存区域分配和对象的创建

首先上一张图:这里主要是看右边的图,这张图描述了JVM中的内存分配区域,其中。我们以这张图为准,介绍JVM内存区域分配中的各个区域。

2023-09-21 17:54:00 125

原创 RecyclerView源码解析(四):RecyclerView对ViewHolder的回收

我们最后来总结一下RecyclerView回收ViewHolder的逻辑,首先RecyclerView尝试填充内容时会先尝试从这四级缓存中获取可用的ViewHolder,首先就是从第一级缓存中查找,如果找到了就直接返回;如果第一级缓存中没有可用的Holder,那么接下来RecyclerView还会额外查看是否有不可见但是仍然附加在RecyclerView的View,如果有的话就将其包装成Holder添加进入第一级缓存中,并将其从之前的父RecyclerView中分离,这就是第一级缓存的来源。

2023-09-17 19:04:59 804

原创 开源库源码分析:OkHttp源码分析(二)

上一篇文章中我们已经分析到了OkHttp对于网络请求采取了,所谓责任链模式就是有多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章我们将着重分析OkHttp中这个责任链的行为逻辑。

2023-09-16 17:33:43 901

原创 开源库源码分析:Okhttp源码分析(一)

接下来就要开始分析一些常用开源库的源码了,作为最常用的网络请求库,OkHttp以其强大的功能深受Android开发者的喜爱(比如说我),还有对该库进行二次封装而成的热门库,比如说Retrofit。本文我们将从源码入手看看OkHttp是如何运作的。注意本文解析的是OkHttp3库,该库是用Kotlin写的,需要大家有一些Kotlin基础。

2023-09-15 18:47:20 4206

原创 Android源码解析:Handler机制

关于如何在Android中进行多线程通信,使用Handler机制是一个好方法。Android提供的Handler机制为我们提供了方便的方法进行线程间通信,具体来说,Handler将会绑定一个线程和Looper,Looper将MessageQueue中的Message取出给Handler进行处理。我们可以看一下这幅图先来有一个大概的印象:本篇文章将从源码的角度对Handler机制进行进一步分析。首先我们需要明确一点,那就是Handler机制的设计是基于生产者-消费者模式的。这和Android UI是单线程的也

2023-09-13 14:54:22 162

原创 设计模式:享元模式

首先我们需要简单了解一下什么是享元模式。:主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式的重点就在这个享字,通过一些共享技术来减少对象的创建,实际上Java中String值的存储,Volley中的也使用到了享元模式,这对提高性能很有用。感觉目前大部分的缓存机制都会用到享元模式。

2023-09-11 16:00:53 336

原创 Java:ArrayList源码解析

最后让我们总结一下ArrayList,首先它是一个可以实现自动扩容的容器。它的默认最小容量为10,每当当前容量已经无法容纳下新加入的元素时就会进行扩容。关于扩容,ArrayList会在修改数据存储区之前自增modCount的值,这个值是为了判断线程安全,实现Fast-Fail用的。

2023-09-06 19:12:57 282

原创 RecyclerView源码解析(三):RecyclerView的缓存机制

终于分析完了这个巨长无比的方法了,现在估计还是很疑惑,现在让我们对上面这个过程进行一下总结。最后我光看到了将viewHolder添加进入RecyclerPool而没有看到清除,所以对其源码进行了查看,发现mRecyclerPool是通过ArrayList存储viewHolder,用SparseArray存储与之相关的一些信息,通过这两个容器检查了回收池中指定类型的视图是否已满。如果池已满,就直接返回,不会将视图添加到回收池中。这是为了限制池中视图的数量,以防止占用过多内存。

2023-09-05 21:24:52 569

原创 RecyclerView源码解析(二):结合LinearLayout分析绘制流程

上篇文章中主要已经介绍了RecyclerView的View的三大工作流程(onMeasure,onLayout,onDraw),实际上看了上篇文章还是很迷糊,因为RecylerView由于实现了高度的解耦,所以阅读整个RecyclerView的源码和理解整个RecyclerView需要结合多个相关的类别。根据这段描述,我们也可以了解到上篇文章提到的预布局和实际布局这两个布局过程的作用,预布局将会实现更好的动画效果,因为它记录了新动画开始之前的旧状态,这可以为更合理的动画迭代效果提供更多的信息。

2023-09-04 20:00:45 229

原创 RecyclerView源码解析 (一):RecyclerView之View的工作流程

在Android中如果想要实现一个可滑动的列表,你会怎么做呢?对于我来说,我接触到的第一个列表类的控件就是ListView,其次就是RecylerView。目前来说,ListView已经很少用了,作为JetPack库中一部分,RecylerView显然是主流。可是对于我来说,我只知道实现RecyclerView的最简单的使用,而不了解其原理,在想要实现一些进阶效果时就有心而无力。

2023-09-04 15:14:49 345

原创 Kotlin开发笔记:协程基础

一般来说,我们的函数总是会有一个入口和一个出口。但是协程不同,虽然协程也是函数,但是协程有多个函数的入口,且其会记忆之前调用的状态,并且对协程的调用可以直接跳转到协程的中间,即它在上一次中断的地方。比如说上面这张图,白色的圆点代表的是函数的中断,箭头代表恢复函数的运行。通过两个函数的协作,这显然可以达到并发执行的效果,执行流也在它们之间进行切换。首先,生产者协程调用消费者协程。在执行部分代码之后,消费者保存其当前状态,并返回或让步给调用方。生产者执行更多的步骤,并回调给消费者。

2023-08-27 14:17:12 355 2

原创 Kotlin开发笔记:拓展函数,属性注入以及一些小技巧

本篇文章是全书第12章,关于Kotlin的流畅性的笔记。本章内容比较杂,主要是涉及到使用Kotlin编写出质量更好的代码。本文将介绍Kotlin的拓展函数,属性注入以及一些使用kotlin编程的小技巧🐤。

2023-08-22 21:16:02 133

原创 Kotlin开发笔记:函数式编程

简单来说,我们之前接触到的编程的主流就是命令式编程,我们需要告诉计算机做什么和如何做。而函数式编程的意思就是我们只需要告诉计算机我们想做什么,计算机会帮助我们实现如何做。我们可以看看维基百科的介绍:>在函数式编程中,函数是头等对象即头等函数,这意味着一个函数,既可以作为其它函数的输入参数值,也可以从函数中返回值,被修改或者被分配给一个变量。λ演算是这种范型最重要的基础,λ演算的函数可以接受函数作为输入参数和输出返回值。实际上就是让我们使用封装的函数来进行编程而不需要每时每刻都关心细节的实现,只有我们想

2023-08-20 11:18:15 242

原创 Kotlin开发笔记:集合和逆变协变

首先我们需要介绍逆变和协变的概念,协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。以我的理解,协变应该接近于extend,而逆变接近于super。默认情况下,在Java中泛型强制实行类型不变性–也就是说,如果泛型函数期望一个参数类型T,则不允许替换基类型T或者派生类型T,类型必须是完全预期的类型实际上,在Java中我也没有对通配符和一般的泛型T的区别和相同有什么很深的理解。我的理解是,通配符?

2023-08-18 23:08:13 234

原创 Kotlin开发笔记:使用委托进行拓展

在OO语言(面向对象)中,我们经常会用到委托或者代理的思想。委托和代理在乍一看很相似,其实其各有各的侧重点,这里我引用ChatGpt的回答:委托(Delegation)和代理(Proxy)虽然有相似之处,但在面向对象编程中有一些区别。虽然委托和代理在某些情况下可能会有重叠,但它们的是不同的。。在实际编程中,选择使用委托还是代理取决于具体的需求和设计目标。通过前面的介绍我们应该对代理和委托的概念和区别有了一定的认识。

2023-08-17 17:13:40 284 2

原创 Kotlin开发笔记:类层次结构和继承

与嵌套类不同,内部类的方法和成员的调用是依赖于外部类的实例的,也就是说,如果有一个内部类的实例那就必然有一个外部类的实例。而在Kotlin中没有明确的静态内部类的概念,取而代之的是嵌套类。在Kotlin中的继承是有一层额外的防御机制的,就如同变量要指定val还是var一样,Kotlin中的类也要指定是否可以被继承,一个类在默认情况下是不允许被继承的。我们先来介绍Kotlin中的嵌套类,Kotlin中的嵌套类类似于Java中的静态内部类,嵌套类和外部类的关系较为独立,大部分情况下没有耦合调用的情况。

2023-08-14 19:28:33 436

原创 Kotlin开发笔记:伴生对象和数据类

本章中我们主要介绍了伴生对象和数据类的相关内容。比较重要的就是伴生对象中的内容,主要是用来实现Java中类似于静态成员变量和方法的作用,但是伴生对象又不是简单的静态的。数据类是Kotlin中的一种特殊的模版类,可以方便地实现一些方法。

2023-07-20 14:48:40 151 2

原创 Kotlin开发笔记:外部迭代与参数匹配

在Kotlin中的迭代和Java中的比较大的区别可能就是Kotlin中新增了范围类,通过操作这些范围类我们就可以灵活地遍历了。除此之外,when语句也是kotlin中更加灵活的语句。合理地使用when语句可以大大简化我们的代码,提升简洁性。

2023-07-20 09:42:13 124

原创 Kotlin开发笔记:类型安全和转换

类型安全是编程中非常重要的内容,在实际编程中我们总是会遇到许许多多的空指针异常,类型错误等异常。因此解决好类型安全的问题可以大大提升程序的健壮性。同时Kotlin针对类型安全就引入了许多有用的机制,它将帮助我们走向防御型编程的道路。本篇文章就将介绍关于Kotlin类型安全的相关信息。

2023-07-18 12:59:26 424

原创 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 837 3

原创 Android进阶 四大组件的工作过程(三):广播的注册,发送和接收过程

相比Activity和Service的工作过程,Broadcast的工作过程还是比较好懂的,主要就是以AMS为媒介,注册时将接收器注册进AMS中存储接收器的列表中;然后发送过程中也通过AMS来实现发送,调用其存储的接收器的onReceive方法,这样就实现了Broadcast的注册,发送和接收。

2023-06-14 21:25:09 1236

原创 Android进阶 四大组件的工作过程(二):Service的工作过程

下面是我总结的一张关于Service工作过程的总结,其中省略了一些细节,主要是帮助理解大致的过程。相信大家也可以发现无论是绑定还是启动,其中都有很多的重合处,无非就是从AMS到ActiviyThread,并且都是通过远程调用的方式。如果要抠细节的话可以看一下AppBindRecord和其他辅助类的关系,这样可以帮助我们更好地理解这整个设计。

2023-06-12 20:19:19 803 1

原创 Android进阶 四大组件的工作过程(一):Activity的工作过程

本系列文章主要是来介绍Android中四大组件的工作过程的,参照书籍为Android进阶解密,主要还是会涉及到源码的阅读。。本篇文章,主要就是来介绍Activity的工作工程的,这里以启动根Activity为例,查看Activity是如何通过系统启动的。这里我们将其分为三个部分来分析,在这之前还是需要介绍一些基础的知识。

2023-06-11 22:02:47 931

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

其实在之前Zygote服务启动的过程中,我们已经提到了这个Zygote服务将会创建出一个Socket来用于给ActivityManagerService使用,应用程序进程的启动就需要ActivityManagerService来给Zygote的服务端发送请求。首先我们介绍ProcessRecord类,这个类是Android系统中用于表示应用程序进程的数据结构。每当应用程序启动时,系统都会为其创建一个ProcessRecord对象来跟踪该进程的状态和信息。具体来说,在ActivityMangerSer

2023-06-10 19:13:46 1062 5

空空如也

空空如也

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

TA关注的人

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