竹杖芒鞋轻胜马

Java 并发-2 线程安全性

要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态进行访问。 对象的状态是指存储在状态变量(实例或静态域)重的数据,对象的状态可能包括其他依赖对象的域。 「共享」意味着变量可以由多个线程同时访问,「可变」意味着变量的值在其生命周期内可以发生变化。<font color=#ff0000>数据安全性更侧重于如何防止在数据上发生不可控的并发访问<...

Java 并发-1 简介

前言 想要充分发挥多核处理器系统的强大的计算能力,最简单的方式就是使用多线程。随着处理器数量的持续增长,如何高效的使用并发正变得越来越重要。这个系列文章重点学习 Java 并发相关的知识:并发可能产生的问题,怎么解决这些问题,以及一些并发工具的使用及原理。 并发简史 早期的计算机并不包含操作系统,它们从头到尾只执行一个程序,并且这个程序能访问计算机中的所有资源。这对于昂贵且稀有的计算机资源...

Android 控件-9 动画

Android 的动画系统每次看了很快就忘,现在 Android 控件系统也学习的差不多了,再系统的过一遍动画。 逐帧动画 使用就不说了,一组资源文件,在 xml 中配置好这组资源文件的切换间隔,然后通过切换不同的资源文件达到「动画」的效果。 那么它是怎么动起来的? AnimationDrawable#start() @Override public void start(...

Android 控件-8 Choreographer

简介 Android 从 4.1 开始引入 Choreographer,它可以看作是整个控件系统的「心脏」,它驱动着动画和 UI 绘制等,作用非常重要,我们今天来学习一下。 官网对其的介绍是: The choreographer receives timing pulses (such as vertical synchronization) from the display sub...

Android 控件-7 ViewRootImpl - 5 performTraversals 之绘制&总结

经过前面几个阶段,每个控件都已经确定好了自己的尺寸与位置,接下来就是最终的绘制阶段。 public void performTraversals(){ ... mFirst = false; mWillDrawSoon = false; mNewSurfaceNeeded = false; mActivityRelaunch...

Android 控件-6 ViewRootImpl - 4 performTraversals 之布局

前言 前两节学习了 ViewRootImpl 中的测量和窗口布局,接下来我们看 View 定制的三剑客之一布局。 布局控件树 经过前面的测量,控件树中的控件的尺寸已经确定,而父控件对于子控件的位置也已了解。布局阶段就是把测量结果实现,即把测量结果转化为控件实际的位置和尺寸。 控件的实际位置有四个成员变量表示:mLeft、mTop、mRight、mBottom,因此控件树的布局过程就是根据...

Android 控件-5 ViewRootImpl - 3 performTraversals 之布局窗口与最终测量

简介 上一节学习了 performTraversals 中的预测量,预测量之后是窗口布局和最终测量。窗口布局阶段以 relatyoutWindow() 为核心,并根据布局结果进行相应处理,当布局结果使得窗口尺寸发生变化时,最终测量将会被执行。 布局窗口的条件 窗口布局阶段的开销很大,因此必须限制窗口布局阶段的执行,倘若不需要进行窗口布局,即 WMS 不会在预测量之后修改窗口尺寸,最终测量也...

Android 控件-4 ViewRootImpl-2 performTraversals 之 预测量

简介 performTraversals() 是一个保罗万象的方法。ViewRootImpl 中接收的各种变化,如来自 WMS 的窗口属性的变化,来自控件树的尺寸变化以及重绘请求等都会引发 performTraversals() 的调用。View 及其子类的 onMeasure()、onLayout()、onDraw() 都是在 performTraversals() 执行过程中直接或间接的...

Android 控件-3 ViewRootImpl-1 构造函数以及重要成员

前言 ViewRootImpl 实现了 ViewParent 接口,作为整个控件树的根部,它是控件正常运行的动力所在。控件的测量、布局、绘制要以及事件的派发都要经过 ViewRootImpl。我们分几个小节学习一下 ViewRootImpl,本节先来看一下它的构造方法和重要成员。 构造方法 ViewRootImpl 创建于 WindowManagerGolbal 的 addView 方法,...

Android 控件-2 invalidate() 流程分析

前言 使用 invalidate() 或 postInvalidate() 可以触发控件重绘。invalidate() 是怎么在控件树中传递的?脏区是怎么计算的?invalidate() 怎么触发的 onDraw()? 带着这些问题今天我们分析下 invalidate() 流程。 postInvalidate() 使用 postInvalidate 可以在非 UI 线程触发 View 的...