首先們要明確Lifecycle中兩個(gè)枚舉值,這兩個(gè)枚舉值和生命周期的狀態(tài)有著直接關(guān)系,我們可以先記住,后面會(huì)看到使用的地方 下面我們先看下,我們?nèi)粘i_發(fā)中是如何使用Lifec...
我們都知道ViewModel在配置更改的時(shí)候,可以保存數(shù)據(jù)而不被銷毀,這是怎么做到的呢?今天我們來見證一下。 我們可以想一下,如果我們要自己實(shí)現(xiàn)數(shù)據(jù)在配置更改后,不會(huì)銷毀,我...
背景 Flutter中我使用的是這個(gè)Lottie組件[https://github.com/xvrh/lottie-flutter]我在做一個(gè)點(diǎn)贊的動(dòng)畫的時(shí)候,就是很簡(jiǎn)單的將...
對(duì)于安裝大小的優(yōu)化,占用最多的就是圖片資源。把圖片資源文件替換webp格式可以大大減少包的體積。 webp是一種圖片文件格式,webp默認(rèn)只支持Android4.0以上。但是...
簡(jiǎn)述 HashMap是一種比較常見的map子類,是由數(shù)組+鏈表組成(JDK8以后采用的是數(shù)組+鏈表+紅黑樹的形式)。元素是以鍵值對(duì)的形式存在,并且允許使用null作為鍵和值存...
從代碼入手,先看下代碼 注意這里我們加鎖的方式是同步代碼塊,然后反編譯下class文件,看一下get方法 這里我們可以看到這兩行,第3行monitorenter和第15行mo...
JMM(Java內(nèi)存模型) 首先我們看下執(zhí)行a+b這個(gè)操作需要幾步:1.從內(nèi)存中取出a2.從內(nèi)存中取出b3.執(zhí)行a+bCPU讀取一次內(nèi)存的響應(yīng)時(shí)間大概為100納秒,執(zhí)行一條指...
定義 隊(duì)列同步器AbstractQueuedSynchronizer(以下簡(jiǎn)稱同步器或AQS),是用來構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架,它使用了一個(gè)int成員變量(state...
隊(duì)列 隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作,和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入...
原子性操作 原子即為不可再分的,原子操作即要么所有操作全部完成 要么全不完成。用synchronized包圍的代碼塊或方法就是原子操作。對(duì)于線程來講,synchronized...
定義 線程本地變量,也有些地方叫做線程本地存儲(chǔ),其實(shí)意思差不多。ThreadLocal可以讓每個(gè)線程擁有一個(gè)屬于自己的變量的副本,不會(huì)和其他線程的變量副本沖突,實(shí)現(xiàn)了線程的數(shù)...
了解死鎖之前,我們要先了解線程的狀態(tài),或者叫線程的生命周期。 線程的狀態(tài)主要分為上圖中的這幾種狀態(tài),這里我們需要注意一下幾點(diǎn): 初始狀態(tài)new出的一個(gè)線程對(duì)象,注意此時(shí)線程并...
前言 一個(gè)窗口里面的所有的普通View都會(huì)共享一個(gè)Surface,這個(gè)Surface保存在ViewRootImpl里面。但是SurfaceView不同,SurfaceView...
上一篇文章講了SurfaceView創(chuàng)建Surface的過程,接下來我們來看下SurfaceView是如何"挖洞"的。說起"挖洞",本質(zhì)上其實(shí)就是設(shè)置一塊區(qū)域,在最后繪制的時(shí)...
之前我們講了Surface的創(chuàng)建過程和SurfaceView的"挖洞"過程)。這一篇我們就開始講講SurfaceView的完整繪制流程 前面也有說過,雖然SurfaceVie...
紅黑樹其實(shí)就是一種自平衡的二叉查找樹,因此在了解紅黑樹之前,先來看下二叉查找樹的原理 1. 二叉查找樹 那么何為二叉查找樹呢?其實(shí)是將二分查找的思想給結(jié)合到樹的結(jié)構(gòu)中來,二叉...
這里我們對(duì)反射的基礎(chǔ)知識(shí)不會(huì)介紹,主要內(nèi)容是相對(duì)深入一些的知識(shí)點(diǎn)和需要注意的點(diǎn),以及給出一些使用上的示例,如果對(duì)基礎(chǔ)知識(shí)需要了解的可以參考這邊文章,Java高級(jí)特性——反射[...