首先们要明确Lifecycle中两个枚举值,这两个枚举值和生命周期的状态有着直接关系,我们可以先记住,后面会看到使用的地方 下面我们先看下,我们日常开发中是如何使用Lifec...
我们都知道ViewModel在配置更改的时候,可以保存数据而不被销毁,这是怎么做到的呢?今天我们来见证一下。 我们可以想一下,如果我们要自己实现数据在配置更改后,不会销毁,我...
背景 Flutter中我使用的是这个Lottie组件[https://github.com/xvrh/lottie-flutter]我在做一个点赞的动画的时候,就是很简单的将...
对于安装大小的优化,占用最多的就是图片资源。把图片资源文件替换webp格式可以大大减少包的体积。 webp是一种图片文件格式,webp默认只支持Android4.0以上。但是...
简述 HashMap是一种比较常见的map子类,是由数组+链表组成(JDK8以后采用的是数组+链表+红黑树的形式)。元素是以键值对的形式存在,并且允许使用null作为键和值存...
从代码入手,先看下代码 注意这里我们加锁的方式是同步代码块,然后反编译下class文件,看一下get方法 这里我们可以看到这两行,第3行monitorenter和第15行mo...
JMM(Java内存模型) 首先我们看下执行a+b这个操作需要几步:1.从内存中取出a2.从内存中取出b3.执行a+bCPU读取一次内存的响应时间大概为100纳秒,执行一条指...
定义 队列同步器AbstractQueuedSynchronizer(以下简称同步器或AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量(state...
队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入...
原子性操作 原子即为不可再分的,原子操作即要么所有操作全部完成 要么全不完成。用synchronized包围的代码块或方法就是原子操作。对于线程来讲,synchronized...
定义 线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。ThreadLocal可以让每个线程拥有一个属于自己的变量的副本,不会和其他线程的变量副本冲突,实现了线程的数...
了解死锁之前,我们要先了解线程的状态,或者叫线程的生命周期。 线程的状态主要分为上图中的这几种状态,这里我们需要注意一下几点: 初始状态new出的一个线程对象,注意此时线程并...
前言 一个窗口里面的所有的普通View都会共享一个Surface,这个Surface保存在ViewRootImpl里面。但是SurfaceView不同,SurfaceView...
上一篇文章讲了SurfaceView创建Surface的过程,接下来我们来看下SurfaceView是如何"挖洞"的。说起"挖洞",本质上其实就是设置一块区域,在最后绘制的时...
之前我们讲了Surface的创建过程和SurfaceView的"挖洞"过程)。这一篇我们就开始讲讲SurfaceView的完整绘制流程 前面也有说过,虽然SurfaceVie...
红黑树其实就是一种自平衡的二叉查找树,因此在了解红黑树之前,先来看下二叉查找树的原理 1. 二叉查找树 那么何为二叉查找树呢?其实是将二分查找的思想给结合到树的结构中来,二叉...
这里我们对反射的基础知识不会介绍,主要内容是相对深入一些的知识点和需要注意的点,以及给出一些使用上的示例,如果对基础知识需要了解的可以参考这边文章,Java高级特性——反射[...