- 博客(52)
- 收藏
- 关注
原创 浅析Android Handler机制实现原理
0. 背景描述Android系统出于对简单、高效的考虑,在设计UI体系时采用了单线程模型,即不会在多个线程中对同一个UI界面执行操作。简单是指单线程模型可以不用考虑和处理在多线程环境下操作UI带来的线程安全问题,高效是指单线程模型下无需通过额外的手段处理多线程安全问题(一般通过加锁等方式解决线程安全问题,而使用锁进行同步就会存在性能开销)。同时,因为Android应用属于UI交互型应用,需要对用户的操作进行快速响应,因此在处理UI操作的线程中不能执行网络请求、本地IO等这一类耗时操作,否则会导致用户的操作
2024-11-04 19:47:33 999
原创 浅析Android中View的硬件绘制流程
硬件绘制在主线程主要负责记录绘制命令并同步绘制命令,而软件绘制则是在主线程完成绘制命令的处理,生成最终的数据;硬件绘制通过RenderNode记录当前View是否需要重新构建来减少不必要的绘制处理,而软件绘制则会对所有View重新进行绘制;硬件绘制引入渲染线程降低主线程的压力,软件绘制则是在主线程完成所有的绘制命令处理;下面给出了梳理后的硬件绘制的主要结构图,用于帮助整体上理解和掌握硬件绘制流程。
2024-10-29 11:23:14 980
原创 浅析Android中View的软件绘制流程
前言在《浅析Android中View的测量布局流程》中分析到,VSYNC信号到达App进程之后开启了View布局过程,经过对整个View树遍历完成测量和布局,最终确定所有View的大小以及在屏幕中所处的位置。但是View的内容想要在屏幕上可见,还需要经过绘制渲染来生成图形数据并交由硬件来刷新屏幕才可以。在《浅析Android View绘制过程中的Surface》中分析到,View绘制渲染生成的图形数据需要在进程间传输,最终才能完成合成上屏。基于跨进程的数据传输,生产者(通常是App进程)生产图形数据并交
2024-10-28 19:49:19 1112
原创 浅析Android View绘制过程中的Surface
首先,当App进程的View的测量数据发生变化时,会导致窗体大小发生变化,此时会调用请求进程的更新窗体的大小,进程通过创建Java层的对象,对应App进程中Java层的对象;进程创建的Java层的对象是一个壳,其内部会通过JNI调用到native层,创建native层的对象,并将native层的对象的句柄值拷贝到App进程的对象;在native层的对象创建的过程中会通过请求到进程,调用创建Layer对象,并将Layer对象的关键信息返回给进程,并用于构造native层的对象;接着,当App。
2024-10-24 19:52:09 1134
原创 浅析Android中View的测量布局流程
从测量流程的分析中,总结出自定义View需要注意的事项:自定义View的从上面的源码分析中可以得知,onMeasure的默认实现是将等同于进行处理,因此自定义View时需要注意对这种情况的处理。解决办法是通过对onMeasure方法进行重写,实现对模式的特殊处理,即判断布局参数是否为,是的话则调用方法并传入具体数值。自定义View的padding参数通过上面源码的分析可以知道,容器类型的View比如都会通过ViewGroup的方法将自身的padding和子View的margin。
2024-10-18 11:59:36 1013
原创 浅析Android中的Choreographer工作原理
Choreographer负责统一调度VSYNC信号,将UI渲染任务同步到VSYNC信号的时间线上。同时Choreographer作为中转站来分发VSYNC信号,并处理上层业务的刷新请求。按照VSYNC信号的周期有规律地准备每一帧数据,实现稳定流畅度的屏幕刷新。
2024-10-17 20:51:13 1004
原创 浅析Android中的View事件分发机制
为了对触摸事件的分发流程进行分析,下面会对主要代码进行分析,和触发事件分发流程本身关联不大的部分直接略过;step 2:根据当前触摸事件类型以及之前的触摸事件是否有对应的处理者来决定是否由当前。通过对触摸事件进行转换处理,同时兼容子View的动画,保证点击事件在动画区域得到响应;一、模版方法模式:在分发触摸事件给子View之前,加入钩子来实现触摸事件的拦截;记录上次触摸事件的处理者,加速后续触摸事件的分发处理;处理本次触摸事件,如果触摸事件落在了子。树都没有处理,整个事件分发流程结束,
2024-09-24 20:19:49 1026
原创 入门学习_Kotlin
由于kotlin和Java之间的高兼容性,使得kotlin适用于服务端、客户端、前端以及数据科学等领域。因此,从Java转向kotlin的学习曲线也更加平滑。究其本质,kotlin和Java一样都是将源代码编译成字节码,从而可以运行在虚拟机之上。此外,对于服务端开发而言,kotlin支持协程,相比Java中的线程,协程更加轻量级。因此,在硬件资源相等的情况下,使用协程可以大大地提高服务端应用的伸缩性。
2020-03-07 10:09:34 572
原创 LeetCode训练营之字符串
longest-palindromic-substring(最长回文子串)Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromi...
2018-11-26 09:07:02 396
原创 LeetCode训练营之排序
一、merge-sorted-arrayGiven two sorted integer arrays A and B, merge B into A as one sorted array.Note:You may assume that A has enough space to hold additional elements from B. The number of element...
2018-11-12 19:34:45 360
原创 多线程编程与艺术之单例模式
懒汉单例模式 //懒汉模式实现单例 public class SingleTon_Lazy { //单例延迟实例化 private SingleTon_Lazy singleTon_lazy; //无参构造函数私有化,禁止使用new进行实例化 private SingleTon_Lazy(){} //静态方法公有化,获取单例 pu...
2018-11-12 09:14:21 276
原创 LeetCode训练营之链表
一、 add-two-numbersYou are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and ...
2018-11-10 18:36:13 390
原创 LeetCode训练营之二叉树
binary-tree-postorder-traversalGiven a binary tree, return the preorder traversal of its nodes’ values.方法一:递归实现前序遍历方法二:迭代实现前序遍历(栈) public ArrayList<Integer> preorderTraversal(TreeNode roo...
2018-11-09 17:13:09 226
原创 LeetCode训练营之栈与队列
Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. public int largestRectangleArea(int[] he...
2018-11-09 13:48:29 240
原创 数据结构与算法之二叉堆训练营
前言: 二叉堆本质上就是一个特殊的完全二叉树。其中,“特殊”表现在节点元素之间存在着大小规律,完全二叉树表示二叉堆的存储结构采用数组实现,只要记住这两点,二叉堆就不难理解和实现;二叉堆根据大小规律的不同,可以分为大顶堆和小顶堆。概念简述: 二叉堆是一种完全二叉树,在这棵树中,任意父节点的值全部大于等于(小于等于)其子节点的值;其中如果任意父节点的值大于等于子节点的值,则该二叉堆就是大顶堆;如果任...
2018-11-08 10:07:12 321
原创 数据结构与算法之队列与栈训练营
1.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 public class QueueImplementedByStack { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Inte...
2018-11-07 21:52:22 186
原创 数据结构与算法之链表训练营
1. 1 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.(栈) public ArrayList&lt;Integer&gt; printListFromTailToHead(ListNode node) { //返回结果 ArrayList&lt;Integer&gt; result = new ArrayList&lt;&gt;(); ...
2018-11-07 19:53:35 223
原创 数据结构与算法之二叉树训练营
public ArrayList PrintFromTopToBottom(TreeNode root) {//返回的层序遍历结果ArrayList result = new ArrayList&amp;amp;amp;amp;lt;&amp;amp;amp;amp;gt;();if(root == null)return result;//根据层序遍历的特点符合队列的先进先出,使用队列作为中间容器,存放每一层的元素Queue queue = ne..
2018-11-05 19:49:11 245
原创 多线程与高并发编程之基础知识(上)
前言:使用多线程,第一步就是需要知道如何实现自定义线程,因为实际开发中,需要线程完成的任务是不同的,所以我们需要根据线程任务来自定义线程,那么,JDK提供了三种自定义线程的方式,供我们实际开发中使用,来开发出符合需求的多线程程序!以下给出线程的三种实现方式,并且对每种实现的优缺点进行分析,最后对三种实现方式进行总结;方式一:继承Thread类,重写run方法package com.thr...
2018-10-01 21:48:25 57482 8
原创 分布式Java应用之集合框架篇(下)
前言:在分布式Java应用之集合框架篇(上)一文中,从整体上对Java分布式应用中的集合框架进行了介绍,以及对于其中的List家族给出了源码分析;本文将继续介绍集合框架中的Set家族和Map家族,其实Set家族和Map家族之间是有着很深的渊源,在本文的后续内容中,将从两大家族的成员的关键实现进行源码层面的分析!首先,还是给出集合框架的整体类图关系,通过类图展开下面的介绍;对于Collec...
2018-10-01 18:32:19 437 1
原创 分布式Java应用之集合框架篇(上)
前言:Java程序员开发程序时,必定会使用JDK中提供的集合类来完成功能模块的开发,而JDK是Java规范的实现,不同厂商提供的JDK也多少会存在一些差异,那么,如何选用合适的集合类实现应用中的具体需求,是每个Java程序员在实际开发中必须解决的一个问题;解决这一问题就需要我们对JDK中集合类的相关实现有一个清晰的认识!...
2018-09-30 15:06:58 919
原创 常见排序算法分析与实现(Java版)
1. 冒泡排序 核心提炼:相邻元素,两两比较并交换,逐趟进行,给人以水泡逐渐上浮的感觉 实现代码: /** * 冒泡排序(两两比较--交换) * @param arr */ public static void bubbleSort(int[] arr){ if(arr == null || arr.length ...
2018-09-10 21:37:21 217
原创 计算机底层原理学习笔记之进程与线程
前言:老生常谈,进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元基本概念: 计算机中的资源: 1. 计算资源:CPU提供的计算能力 2. 存储资源:内存、硬盘等提供的存储能力 3. 经典冯诺依曼结构:CPU+存储器+IOCPU可视为黑盒,输入的是待处理的指令和数据,输出的是处理后的结果;即CPU只提供计算能力,不提供计算资源的调度管理;因此,计算资源由操...
2018-09-04 11:06:52 529
原创 多线程与高并发编程进阶(二)
前言:一般来说,Java代码从编写到最后的执行会经历以下的过程:Java源代码(.java文件)–&amp;lt;即时编译器&amp;gt;–Java字节码(.class文件)–&amp;lt;类加载器加载&amp;gt;–汇编指令(CPU执行);Java中的并发机制依赖于JVM以及CPU指令,这些具体的实现原理将在下面进行分析;在Java的并发机制中,比较典型也比较常见的两个关键字:volatile以及synchroniz...
2018-09-03 22:32:30 1541
原创 多线程与高并发编程进阶(一)
使用多线程的目的:充分利用CPU资源以及加速程序运行速度 使用多线程面临的挑战:上下文切换、死锁、计算机资源的限制等上下文切换: CPU通过为每个线程分配CPU时间片来实现即使在单核的情况下,依旧可以使用多线程执行代码的机制; 时间片就是CPU的执行时间,通过分配时间片给各个线程,用以执行对应的代码;由于时间片一般很短(几十毫秒左右),所以需要不停地切换线程来使用对应的时间片...
2018-09-03 20:05:49 1840
原创 数据库基础知识杂记
数据库相关知识总结数据库:数据结构、存储引擎、什么是存储引擎以及不同存储引擎特点 - wildfox - 博客园事务隔离级别(根源:并发性操作数据库)实现机制:锁机制实现隔离级别级别影响:隔离级别低—>并发性高—>系统开销低隔离级别:Read Uncommitted—>Read Committed—>Repeatabl...
2018-08-05 16:25:46 237
转载 ThreadLocal浅析
ThreadLocal概念ThreadLocal 字面意思来看有点像“线程的本地实现版本”,实际上真正含义是ThreadLocalVariable(线程本地局部变量),所以把它命名为ThreadLocalVar更加合适。ThreadLocal 是用来解决共享对象(单个线程内共享)的多线程访问问题的,使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并...
2018-03-08 09:33:35 281
原创 Java多线程之线程安全的实现方法
同步互斥(阻塞式同步)同步互斥是一种常见的并发正确保障手段;其中,同步是指在同一个时刻,多个线程中只能有一个线程去访问共享变量;互斥是指实现同步的一种手段,如临界区、互斥量和信号量; 在Java中,最基本的互斥同步手段就是synchronized关键字;synchronized关键字经过编译后,会在同步块的前后分别形成monitorenter和monitorexit两条字节码指令, ...
2018-03-08 09:31:26 1095
原创 Java设计模式(2)之简单工厂模式&工厂模式
前言:先遇到问题再找解决问题的方法!在开始介绍简单工厂模式,先通过一个场景来引出简单工厂模式出现的目的;在Java开发中,我们经常与数据库打交道,但是,由于生产数据库的厂商有很多,因此可供开发使用的数据库也就有很多,但是无论选择哪种数据库,这些数据库都会支持一些公共的数据操作,比如插入、删除、查询以及修改等操作,不过对于不同的数据库来说,这些操作的代码编写遵循的规范也不相同,因此,如果使用...
2018-03-07 17:12:05 178
原创 多线程与高并发编程之基础知识(下)
Java线程的实现: Java线程模型是基于操作系统原生线程模型来实现的;线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编写和运行过程来说,并没有什么不同;Java线程调度: 线程调度是指系统为线程分配处理器使用权的过程;主要调度方式有:抢占式线程调度、协同式线程调度; 抢占式线程调度:每个线程由系统来分配执行时间,线程的切换不由线程本身决定;Java默认使用的线程调度方...
2018-03-07 09:55:40 6688 2
原创 Java集合框架成员之HashTable类的源码分析(基于JDK1.8版本)
首先给出关于此类的一些概括性的知识点: 1.这个类实现了一个哈希表,在这个哈希表中将键与值形成映射关系;任何非null对象都可以用来作为一个键或值; 2.为了成功地从一个哈希表中存储和检索对象,哈希表中被用来作为键的对象必须实现hashCode和equals方法; 3.影响Hashtable性能的两个参数:初始化容量(initial capacity)和装载因子(load factor); ...
2018-03-06 13:22:32 289
原创 集合、异常综合应用之简易扑克牌游戏
package imooc.poker;public class Card implements Comparable { private String shape; private String number;public Card(){ this("","");}public Card(String shape,String number){ ...
2018-03-01 13:40:44 290
原创 三大特性应用之YY出租系统的设计
Java基础项目: 项目描述:设计一个车辆出租系统,在设计中,利用面向对象编程的三大特性:封装性、继承性以及多态性;完成的功能:在控制台进行出租车辆的信息,接收用户的输入,根据用户的输入,完成对应的操作,实现简单的请求-响应的业务功能;实现的难点:项目源码:package com.boker_han;//抽象类(出租车辆共有的基本信息的描述方法)public abstract...
2018-02-28 19:29:17 903
原创 多线程并发场景下的单例模式设计
单例模式在项目开发中是一种常用的设计模式。对于普通场景下,单例模式分为懒汉单例模式和饿汉单例模式(关于这两种模式的详解参见博文Java设计模式(1)之单例模式学习总结);但是,在现代的软件开发中,多线程、高并发是编写Java应用程序的必须解决的一个问题,如何使单例模式在多线程、高并发的场景下能够正常发挥其作用,是Java程序员必备的知识技能之一;想要在多线程、高并发的场景中,维持单例模式的单例...
2018-02-28 16:30:11 941
原创 深入JVM之垃圾收集
前言: 之前了解了Java虚拟机所管理的内存区域划分情况之后,接着,又对Java虚拟机中的对象进行了深入探秘,下面应该进入Java虚拟机的重点——垃圾收集器的深入之旅;在编程语言界,了解和学习过Java和C++的程序员都知道,Java是不需要手动为对象申请内存和释放内存编写代码的,这些工作由Java虚拟机代为执行,但凡事有利就有弊,伴随着Java虚拟机为Java程序员提供了内存管理上的便...
2018-02-26 20:05:21 186
原创 Java虚拟机中的对象探秘
前言: Java是一门面向对象的语言,在Java程序运行的过程中,无时无刻都有对象被创建出来;在了解了Java虚拟机在运行时管理的内存区域的结构划分后,就可以进一步去理解在虚拟机中是如何为对象分配内存、对象的内存布局以及如何访问对象;下面将基于主流的Java虚拟机Sun HotSpot以及常用的内存区域Java堆,对上述的三个方面进行深入理解;虚拟机中对象的创建过程 在语言层面上...
2018-02-26 13:02:57 267
原创 Java虚拟机中的内存区域划分——运行时数据区域解析
前言: Java虚拟机提供的自动内存管理与垃圾回收机制,使得Java与C++之间隔着一座难以逾越的界线,也正是因为Java虚拟机为Java程序员提供了内存管理上的便利,导致了一旦发生内存泄漏和内存溢出问题,不熟悉Java虚拟机运行原理的Java程序员将会对发生的问题一筹莫展;所以,对Java虚拟机的运行原理进行学习理解是成为一名合格的Java程序员的必修课! ...
2018-02-25 23:03:01 389
原创 Java集合框架成员之LinkedList类的源码分析(基于JDK1.8版本)
LinkedList类实现了List接口以及Deque接口,并且是双向链表的实现版本;LinkedList类实现了所有可选的列表操作,并且允许添加包括null元素在内的所有的元素;LinkedList类中的所有操作都可以认为是对双向链表使用的;LinkedList类是非线程安全的。如果多个线程并发地访问一个LinkedList对象时,并且至少有一个线程从结构上修改了该链表,那么必须在外部对...
2018-01-13 09:38:11 241
原创 Java集合框架成员之ArrayList类的源码分析(基于JDK1.8版本)
加深对Java的学习与理解的最好途径之一,就是在掌握了Java的基础知识之后,对JDK中的源码进行学习和分析;通过分析牛人们的代码,可以学到很多东西!这些知识和经验对于巩固加深对Java的掌握来说,大有裨益!在分析源码之前,先概述性地列出ArrayList类的一些注意点:①ArrayList类是List接口的基于可变数组的实现类;实现了List接口提供的所有操作,并允许添加包含null元素...
2018-01-11 20:15:41 422
原创 多线程中的线程间通信及等待/通知机制的两种实现方式
多线程编程中,如果每个线程之间互相独立,那么将会使多线程带来的优势不能够很好地发挥出来。使用线程间通信,可以使得原先的互相独立的多个线程之间,能够很好地互相协作,使得系统之间的交互性得到提升,大大提高了CPU利用率,从而完成一些复杂的多线程功能模块。多线程间的通信一般采取等待/通知机制进行实现。见名知意,等待通知就是处于等待状态的线程需要由其他线程发出通知,从而可以再次获得CPU资源,执行之前...
2017-11-21 18:37:59 4447
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人