- 博客(46)
- 收藏
- 关注
原创 源码 解读事件分发机制
文章目录源码角度 解读事件分发View 的事件分发 (View.dispatchTouchEvent())1.流程2.源码stopNestedScroll()onTouchEvent(MotionEvent event);1. performClickInternal();2.checkForLongClick()ViewGoup 事件分发( ViewGroup.dispatchTouchEven...
2020-04-27 13:51:36
360
1
原创 热修复原理分析
文章目录类加载机制类加载器双亲委派机制:类加载器加载步骤Android 中的类加载器PathClassLoader 和 DexClassLoader 对比Android 中的类加载分析BootClassLoader 引导类加载器:手机启动后,加载操作系统中的预加载类。PatchClassLoader :加载时序图热修复切入点解决方案类加载机制类加载器在类加载阶段,在虚拟机外部。通过一个类的...
2020-04-17 16:45:10
240
原创 LiveData+LifeCycle
谷歌组件LifeCycle:感知生命周期使用LiveData:绑定生命周期的数据持有类api注册观察者通知观察者SetValue(T data)postValue(T value)移除观察者LiveData 和ModelView 共同使用创建ViewModel注册观察者发送事件LifeCycle:感知生命周期LifeCycle : 绑定了activity的生命周期,通过注册观察者,可以用来监...
2020-03-16 11:43:53
571
原创 组件架构ViewModel
组件架构ViewModel1.What?2.使用方法1.创建需要保存的ViewModel2.创建Provider ,通过provider,获取保存在ViewModelStore 中的 ViewModel 实例3.ViewModel1. 关联application的ViewModel4.ViewModelProvider构造函数Factory获取ViewModel 实例5.ViewModelStor...
2020-03-15 13:12:49
317
原创 字典序算法
字典序算法字典序就是按照字典中出现的先后顺序进行排序单个字符在计算机中,25个字母以及数字字符,字典排序如下:字母 : ABCDE~XYZ数字:12345678~多个字符两个字符串比较大小,是按照从左到右的顺序进行比较,如果第1位相等,就比较第2位,直至有一位可以比较出大小来,则不再继续比较。全排列的字典给定多个字符或者字符,可以按照任意顺序进行排列,所有排列称为全排列。...
2020-02-21 19:33:59
1061
原创 选择排序
选择排序算法原理 : 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 public static void sort(int[] datas){ //第一轮循环是 选择设置对应位置的数据 ...
2020-02-18 14:18:33
241
原创 桶排序
桶排序桶排序是一种线性时间排序算法。类似于计数排序所创建的统计数组,桶排序需要创建若干个桶协助排序。步骤1.确定桶数,确定桶的区间范围;2.遍历原始数据,把元素对号入座放入各个桶里;3.堆每个桶内部元素分别进行排序;4.遍历所有桶,一次输出所有元素; public static float[] bucketSort(float[] datas){ float m...
2020-02-17 22:38:50
110
原创 计数排序
计数排序计数排序,是利用数组下标来确定元素的正确位置。基本算法对于 序列 {2, 1, 2, 3, 7, 9, 0, 7, 8, 6, 5},元素的取值范围 是【0,9】。因此,可以采用空间置换时间的想法,定义一个长度为10的数组C,这样可以保证 序列中的元素值 ,可以依次对应到 数组的下标中。通过遍历序列,我们可以将序列中元素出现的次数依次 定义到数组C中 。出现次数1...
2020-02-17 19:29:54
490
原创 堆排序
堆排序指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点二叉堆的知识点原理:不管是最大堆还是最小堆,通过若干 将堆顶元素 和 有效 尾部元素替换,重新调整生成新的堆顶的过程。 每个过程,都是将堆顶(最大或最小值) 移动到数组 的尾部,因此。当所有堆顶元素都置换到 集合的尾部时。集合则是一个和堆相...
2020-02-16 00:19:51
101
原创 二叉堆
二叉堆堆堆,本质上是一种完全二叉树。分为,最大堆和最小堆。 它的物理存储结构是 数组。因此:左孩子节点的 索引值= 它的父节点索引值2+1;右孩子节点的索引值=它的父节点索引值2+2;堆的分类最大堆: 任何一个父节点的值都大于或等于它的左右孩子节点的值。最小堆:任何一个父节点的值都小于或等于它的左右孩子节点。二叉堆的构建把一个无序的完全二叉树调整为二叉堆。本质...
2020-02-15 22:33:47
92
原创 快排算法
快排算法快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。简而言之,快排算法,就是我们常说的二分法。 通过基准值,将数字序列 分为 小于临界值的部分,和大于临界值的部分...
2020-02-14 23:16:28
851
原创 冒泡排序
冒泡排序冒泡排序:1.在一组无序的数字序列中,通过从序列的开始到结尾,相邻的的元素进行两两比较,当元素大于右侧的元素的时候,交换彼此的位置。最终经过每轮比较可以将数字大的数字移动到数列的尾部。2. 每轮的比较结果,都会确定出对应的有序区长度。例如:经过第一轮比较,我们,我们可以确定出序列的最大值(有序区长度 =1) ,经过第二轮比较,可以确定出第二大的值(有序区长度=2),第三轮确定出 第...
2020-02-13 19:50:29
322
原创 二叉树遍历(递归 +迭代)
二叉树的遍历二叉树——是一种 典型的非线性 数据结构。 而 在计算机程序中,遍历本身是一种线性操作。因此,二叉树的遍历,本质是非线性关联的节点转换成 一个线性 的序列,再 进行线性遍历。遍历类型深度遍历前序遍历(根-> 左-> 右)中序遍历( 左->根-> 右)后续遍历( 左-> 右->根)广度遍历层序遍历(一层一层的 遍历)...
2020-02-11 19:46:12
210
原创 Window 源码解读(二)——View 的移除,添加,更新
通过 Window 源码解读(一),我们了解到。Activity 中 ,Window 的实际实现类是 PhoneWindow。WindowManager 继承自 ViewManager ,实际实现类是 WindowManagerImpl。Window 中,View 的添加是通过 WindowManagerGlobal 来完成本章我们来梳理View 的Tina阿基,移除,更新过程...
2019-12-16 16:46:31
824
原创 Window源码 解读(一)
Window 源码解读Window 是一个窗口概念。它是所有view 的载体。在Widow 机制中,会接触到这几个类如下面类图。我们按照这个思路,梳理一下源码WindowAbstract base class for a top-level window look and behavior policy. Aninstance of this class should be us...
2019-12-16 16:45:44
839
原创 AttachInfo(源码解析)
/** * A set of information given to a view when it is attached to its parent * window. */ final static class AttachInfo { //回调接口 interface Callbacks { ...
2019-12-12 11:56:48
764
原创 ViewParent(源码解析)
ViewParent定义将成为视图父类的类的职责。视图想要和父类视图交互的ApIpublic interface ViewParent { /** * Called when something has changed which has invalidated the layout of a * child of this view parent. Th...
2019-12-11 16:13:04
618
原创 Choreographer ——编舞者
Choreographer(编舞者)官方解释/** * Coordinates the timing of animations, input and drawing. * <p> * The choreographer receives timing pulses (such as vertical synchronization) * from the display ...
2019-11-16 18:10:14
696
1
转载 Android的16ms和垂直同步以及三重缓存
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...
2019-11-06 14:52:54
380
原创 Handler机制(View.post(Runnable action)原理)
Handler机制(View.post(Runnable action)原理)场景实际开发的过程中,我们一定会遇到.当在Activity 的onCreate() 中,通过 view.getTop()/ View.getWidth() 等方法来获取,控件的长宽等距离属性的时候。往往,事与愿违,获取的结果为0:。原因: 当我们在获取的时候,View 并没有完成,测量,布局等操作。因此,通过这些...
2019-11-05 16:01:41
520
原创 Handler机制(深入篇)
Handler机制(深入篇)反思通过上一节 “handler驱动模型",我们已经明白。Android系统,任何事件(小到滑动,大到 界面绘制)等,都是基于Looper 不停的循环来完成的。那么问题来了:当MessageQueue中,没有待处理的Message时,Looper还是一直进行着循环,那是不是很消耗cpu资源呢?同理,主线程也存在MainLooper,为什么UI线程并不会卡死呢?...
2019-11-05 10:47:22
240
1
原创 Binder机制——ServerManager进程 与 应用进程之间的通讯
ServerManager 进程 与 App 进程之间通讯通过上节 “Binder 的原理”,我们已经搞清楚了:应用进程中,直接经过 Binder 驱动的桥梁,根据 Binder的 名称 ,从 ServerManger 进程中,获取所需Binder 的代理,从而完成了跨进程通信。其实,仔细想来,这个过程,准确的说,是完成了2次跨进程的通信1.应用进程 和 所需要通讯的进程之间2. 应用进...
2019-10-25 15:09:42
294
原创 Binde机制——原理
原理Android 系统 是基于Linux 系统 ,因此想要深入了解Binder 机制。那么我们需要了解一部分Linux 知识。Linux预备知识进程隔离简单的说就是操作系统中,进程与进程间内存是不共享的。两个进程就像两个平行的世界,A 进程没法直接访问 B 进程的数据,这就是进程隔离的通俗解释。A 进程和 B 进程之间要进行数据交互就得采用特殊的通信机制:进程间通信(IPC)。...
2019-10-14 16:57:37
894
1
原创 Binder机制——AIDL
通过上节手撸Binder ,我们已经初步了解了 Binder 的一个执行流程。接下来,我们主要探讨一下,在平时Binder 开发中,运用最多的AIDL 技术。AIDLAIDL 是一种 跨进程通讯技术,它的底层就是Binder。由于,手写Binder的工作量十分庞大,例如,Parcel 的操作,就搞得我们头很大。因此,android 通过AIDL 技术,屏蔽了底层的操作细节,让我们更方便的开...
2019-10-13 18:01:28
380
原创 Binder机制——初步认识
*Binder(译 “粘合剂”) **作为一种android 系统独有的 跨进程机制**,在跨进程通讯中起着举足轻重的作用。越是深入了解,越会感到豁然开朗*。虽然,网上前辈的资料已经十分丰富。本文将以一个菜鸟的角度,从每次学习和理解的认知深度,来梳理一遍。
2019-10-13 16:02:57
249
原创 理解 Parcel 和 Parcelable
Parcel官方文档的语义是消息的容器。消息包括,数据和对象的引用。Parcel是android 系统特有的一套机制,可以将序列化之后的数据写入一个共享内存中,其他进程通过Parcel可以从这块共享内存读出字节流,并反序列化成对象。android 中 每个进程 都包括(自己本身的内存空间+部分共享内存空间),所以不同进程可以通过这段共享内存进行传递Parcel 打包好的数据(IPC过程...
2019-10-11 18:25:30
974
原创 SystemServer进程——发育篇
通过上篇文章的梳理。我们已经了解到,SystemServer 进程启动,是从Zygote 进程的 forkSystemServer () 方法开始,最终走到了,自己的main(入口) 方法。接下来,一起看下main中 ,都做了哪些骚操作?SystemServer 入口 main方法//SystemServer.javapublic static void main(String[]...
2019-10-08 17:16:08
330
原创 SystemServer进程启动——出生篇
SystemServer 进程简介zygote:是受精卵的意思,它是Android中的一个非常重要的守护进程服务(Daem Service),所有的其他Dalvik虚拟机进程都是通过zygote孵化(fork)出来的。Android应用程序是由Java语言编写的,运行在各自独立的Dalvik虚拟机中。如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,会大大降低系统性能,因此Andr...
2019-09-27 15:33:03
370
原创 Zygote进程启动流程
zygote 进程简介zygote:是受精卵的意思,它是Android中的一个非常重要的守护进程服务(Daem Service),所有的其他Dalvik虚拟机进程都是通过zygote孵化(fork)出来的。Android应用程序是由Java语言编写的,运行在各自独立的Dalvik虚拟机中。如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,会大大降低系统性能,因此Android首先创...
2019-09-25 19:34:10
998
原创 Zygote进程预加载类文件
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * Yo...
2019-09-25 18:46:47
1023
原创 Hander 机制(驱动模型理解)
一,概要Android 应用是基于事件驱动的,每个事件(UI绘制、滑动等)都会转化为一个系统消息,即 Message。然后,系统 looper通过维护一个消息队列 messageQueue来完成消息的分发处理. 二,介绍1.Message( 快递)public final class Message implements Parcelable { ...
2019-08-31 21:36:07
314
原创 Maven实现组件化方案
Maven实现组件化方案1.有过组件化开发经历的童鞋,一定有一个很头大的问题:不同项目,依赖相同模块的时候,当这个共同的模块迭代需要的时候,我们总是需要手动移植好多次,而且容易出错。这无形中增加了工作量和出错率。因此,有没有一种可以共享的方式,来解决这种问题,看来是首当其冲2.我曾今想过,可以通过代码托管仓库—— 分别管理具体的模块和组件maven仓库和托管配合仓库协同——代码可以托...
2019-08-16 18:58:26
703
原创 Shader
setShader( Shader mShader) 是Paint 的一个api。他主要是通过 Shader 的子类 实现一种着色的效果(给paint 设置一种绘图策略,类似于 颜色,阴影等)。BitmapShaderpublic BitmapShader(Bimap bimap,TitleModemodeX,TitleMode modeY);modeX:当View的宽...
2019-04-06 20:21:05
168
原创 module 中添加 aar 文件
事故前提: app(主项目) 依赖了module( myLibrary),要在moudle中添加一个aar文件 1.将aar 添加到module的libs 。 2.告诉module 的gradle aar的文件位置。android { ...省略 repositories { flatDir(dirs: 'libs') }...
2019-03-27 15:11:19
789
原创 刮刮乐效果
BitmapShader+ path 实现“”刮刮乐“”效果步骤:准备一张尺寸不小于view 的图片,这样shader 不会使用填充模式package boyikia.com.thumbsview;import android.content.Context;import android.graphics.Bitmap;import android.graphi...
2019-03-26 23:26:47
710
原创 图片,文字优雅的添加阴影!
图片添加阴影,一般两种两种思路:1.layer_list (多张图重叠放置)。 2.setShadowLayer() (作用于 图片 ,或者文字)。 1.setShadowLayer();radius--------以下所有该参数都代表模糊半径,高斯模糊算法。 /** * * @param rad...
2019-03-22 00:12:50
509
原创 flutter 环境搭建(Window 环境)
面对互联网未来“大前端”的趋势,跨平台开发优越性是显而易见的,因此决定入坑 flutter!目录1.搭建前要求:2.安装步骤1.搭建前要求: a.win7以上系统。 b.git 。 c. AS3.0 及以上2.安装步骤 1.由于翻墙的原因,需要配置临时镜像 (配置时,请查阅最新镜像 )。export PU...
2019-03-14 23:39:11
131
原创 支付宝支付成功动画(Path)
1.效果展示2.实现步骤public PathMeasureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //1.关闭硬件加速(否则有问题) set...
2019-03-12 23:26:30
1495
原创 PathMeasure
目录API总结:简单函数: PathMeasure(Path originalPath,boolean forceClosed); getLength() isClosed() nextContour() 重要函数(动画需要使用) getSegment(float startD,float stopD,...
2019-03-12 00:05:36
182
原创 解决 1.view.Layout() 失效 2. getTop() . getLeft() getTop() getBottom() 返回值为0
实践是检验真理的唯一标准问题缘由:自定义View开发的小伙伴,肯定会遇到。代码中onCreate() 方法中 ,直接调用view.layout()想要移动控件位置的时候,发现效果并没有达到预期的(控件一点都没有移动,尴尬),然而通过Value动画调用该方法的时候,是起作用的。why?why?。ValueAnimator animator=ValueAnimator.ofInt(0,4...
2019-03-09 17:38:38
1209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人