自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 屏幕刷新机制-源码流程阅读

文章目录结论1. UI刷新流程示意2. 源码流程2.1 ViewRootImpl.scheduleTraversals2.1 Choreographer.postCallback2.3 FrameDisplayEventReceiver.onVsync2.4 Choreographer.doFrame2.5 Choreographer.doCallbacksAndroid系统通过一个VSYNC来保证每16ms最多绘制一帧. 也就是说: UI必须至少等待16ms的间隔才会绘制下一帧, 所以连续两次setT

2021-03-06 18:13:32 684 1

原创 性能优化-FPS基础概念

笔记很多来自各种摘抄文章目录1. Android系统显示原理2. 绘制原理2.1 应用层2.2 系统层3. 帧率4. 屏幕刷新频率5. 单缓存画面撕裂6. 单缓冲 + 同步锁与双缓冲 + 同步锁6.1 双缓冲 + 同步锁6.2 VSYNC7. 三缓冲7.1 为什么要有三缓冲1. Android系统显示原理  Android应用程序把经过测量、布局、绘制后的surface缓存数据通过SurfaceFlinger把数据渲染到显示屏幕上, 通过Android刷新机制来刷新数据. 也就是说应用层负责绘制, 系

2021-03-03 00:16:48 1164

原创 ANR笔记

文章目录一、ANR背景1.1 ANR种类1.2 ANR具体超时1.3 ANR原因二、数据收集一、ANR背景1.1 ANR种类Service Timeout: 比如前台服务在20s内未执行完成Broadcast Timeout: 比如前台广播在10s内未执行完成ContentProvider Timeout: 内容提供者, 在publish超时10sInputDispatching Timeout: 输入事件分发超时5s, 包括按键和触摸事件1.2 ANR具体超时1. Service<

2021-03-01 23:04:45 612

原创 多线程基础知识

文章目录多线程脑图一、乐观锁与悲观锁1.1 悲观锁1.2 乐观锁1.3 悲观锁与乐观锁对比二、锁优化2.1 自旋锁与自适应锁2.2 锁消除2.3 锁粗化2.4 轻量级锁2.5 偏向锁三、公平锁与非公平锁3.1 公平锁3.2 非公平锁3.3 NonfairSync与FairSync3.3.1 NonfairSync.tryAcquire3.3.2 FairSync.tryAcquire四、yield与sleep4.1 共同点4.2 yield4.3 Thread.sleep多线程脑图一、乐观锁与悲观锁1

2021-02-28 22:22:58 856

原创 Handler源码阅读

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例

2021-02-21 23:10:10 105

原创 Binder机制

内存被操作系统划分为两块: 用户空间和内核空间, 用户空间是用户程序代码运行的地方, 内核空间是内核代码运行的地方, 为了安全, 它们是隔离的, 即使用户的程序崩溃了, 内核也不受影响.文章目录一、视频关键内容截图1.1 Binder一次拷贝1.2 写文件流程1.3 AIDL1.3.1 代码结构一、视频关键内容截图1.1 Binder一次拷贝内核空间1与用户空间2共享同一块物理内存, 用户空间1数据data拷贝到内核空间1, 内核空间1的数据data映射到物理内存, 用户空间2可以直接从该共享..

2021-02-13 23:01:58 427 1

原创 HashMap源码学习

文章目录前言一、HashMap初始化1.1 tableSizeFor二、HashMap.put2.1 哈希函数2.2 putVal计算索引值2.3 总结三、数组扩容3.1 putVal数组扩容3.2 resize数组扩容3.3 loadFactor装载因子3.1 装载因子的作用3.2 为什么是0.753.3 resize扩容时数组拷贝前言HashMap看过几次源码, 大致流程清楚, 但是有几个比较关键的点还是不太明白, 这次尝试比较彻底的搞明白这几个关键点:1、散列函数2、哈希冲突3、扩容方

2021-01-31 16:43:15 118

原创 创建线程OOM问题分析与解决

文章目录前言一、线程OOM1.1 OOM背景1.1.1 错误一1.1.2 错误二1.2 Android内存管理策略1.3 Thread.start源码分析1. thread.CreateNativeThread2. pthread_create.pthread_create3. pthread_create.__create_thread_mapped_space前言系统的学习、总结. 千万不要再犯零零散散学习的毛病了一、线程OOM1、背景2、Android内存管理策略3、源码分析1.1

2021-01-17 23:20:57 1815

原创 Linux基础知识学习

文章目录前言一、内存1.1 零散知识总结1.2 虚拟内存1.2.1 局部性原理1.2.1.1 时间局部性1.2.1.2 空间局限性1.2.2 虚拟内存1.2.2.1 虚拟内存三个特征1.2.3 虚拟内存概念1.3 物理内存二、mmap二、使用步骤1.引入库2.读入数据总结前言基础不牢, 地动山摇一、内存包含以下几个内容:1、零散的知识总结2、虚拟内存3、物理内存4、内存映射5、虚拟内存映射6、共享内存7、匿名共享内存8、分页1.1 零散知识总结这里的零散的知识很可能过不了多

2021-01-11 23:16:40 671 1

原创 Matrix---ResourceCanary源码分析

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例

2020-12-01 23:09:43 826 1

原创 LeakCanary源码分析

LeakCanary源码分析不要记源码细节, 记也记不住, 记涉及到的基础知识、学习思想、学习架构、学习用到的哪些设计模式一、 监控内存泄漏1.1 内存泄漏的流程1、添加Activity生命周期的监听2、Activity执行了onDestroy之后, 理论上来说, Activity应当被回收掉, 但是实际上并没有被回收掉3、此时将Activity与弱引用进行关联, 这里思考一个问题, 为什么不将该Activity与软引用进行关联?4、同时将该弱引用与引用队列进行关联, 然后将该Activi

2020-11-29 23:19:08 165

原创 Replugin-框架初始化流程

  项目中使用了Replugin, 本打算直接开怼源码, 阅读了几段代码, 发现极其困难, 这个也是自己目前的一个问题, 先不要急着直接开始进行源码阅读, 首先需要尝试了解整个大体框架, 然后针对这个大体框架流程再结合具体的代码进行分析, 会事半功倍. 否则就会陷入代码中之间树木不见森林.以后在阅读其他代码时, 需要注意一、外置插件  外置插件是指可通过"下载"、"放置SD卡"的方式来安装并运行的插件,//安装外置插件Replugin.install("插件Apk路径")  默认情况下, 无论

2020-07-13 23:02:03 1040

原创 Matrix---FrameTracer源码分析

参考View、Window、WindowManager—vsync信号View、Window、WindowManager—Choreographer源码阅读Matrix提供了fps检测的功能, 该功能由 FrameTracer 完成, 这里围绕FrameTracer分析/** * 何时被回调? * visibleScene: 当前Activity名 * taskCost: 整个任务耗时 * frameCostMs: 该帧耗时 * droppedFrames: 消耗帧数 * isConta

2020-07-04 10:00:38 832

原创 View、Window、WindowManager-vsync信号

转载Android 之理解 VSYNC 信号Android应用性能优化系列视频双语字幕讲解 By GoogleAndroid Project Butter分析Android VSYNC与图形系统中的撕裂、双缓冲、三缓冲浅析在阅读Matrix源码时, 发现Matrix会hook Choreographer这个类, 然后跟进这个Choreographer类, 又涉及到VSYNC这个概念, 先对这个VSYNC概念进行整理.以下所有内容全部为从各种文章东拼西凑而来.包含以下这些概念:1. 刷新率2

2020-07-03 22:38:12 326

原创 Replugin源码阅读-replugin-host-library

参考文章Android 全面插件化 RePlugin 流程与源码解析1. Replugin介绍1.1 Replugin结构1.replugin-host-gralde: 宿主脚本2.replugin-host-library: 宿主库3.replugin-plugin-gradle: 插件脚本4.replugin-plugin-library:插件库打算从以上四个模块对replugin进行拆解阅读RePlugin的思想是Hook ClassLoader, 因此接下来就围绕Class

2020-06-29 12:03:10 320

原创 View、Window、WindowManager---Choreographer源码阅读

参考文章Android 之理解 VSYNC 信号Android应用性能优化系列视频双语字幕讲解 By GoogleAndroid Project Butter分析Android Choreographer 源码分析1. 概念相关概念:1.收到vsync信号之后, 顺序执行input、animation、traversal三个操作, 然后等待下一个信号, 再次顺序执行三个操作.2.假设在第二个信号到来之前, 所有的操作都执行完成了, 即draw操作完成了, 那么第二个信号来到时, 此时界面将

2020-06-27 23:09:24 207

原创 java并发编程实践_06任务执行

在线程池中执行任务线程, 这种方法有很多”没任务每线程”无法比拟的优势, 1、重用存在的线程, 而不是创建新的线程, 这可以在处理多请求时抵消线程创建, 消亡产生的开销. 2、另一项好处就是在请求达到时, 工作者线程通常已经存在, 用于创建线程的等待时间并不会延迟任务的执行, 因此提高了响应式.

2017-04-05 23:38:12 274

原创 java并发编程实践_02线程安全

1、原子性: 假设有操作A和B, 如果从执行A的线程的角度看, 当其他线程执行B时, 要么B全部执行完成, 要么一点都没有执行, 这样A和B互为原子操作, 一个原子操作是指: 该操作对于所有的操作, 包括它自己, 都满足前面描述的状态. 原子性的含义与它在事务性应用中相同->一组语句作为单独的, 不可分割的单元运行.2、synchronized: 一个synchronized块有两部分, 锁对

2017-04-04 23:02:11 316

原创 深入理解Java虚拟机_02自动内存管理机制

1. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1、程序计数器; 2、Java虚拟机栈; 3、本地方法栈; 4、Java堆; 5、方法区;2. Java虚拟机栈: Java虚拟机栈是线程私有的, 它的生命周期与线程相同, 虚拟机栈描述的是Java方法执行的内存模型: 每个方法在执行的同时都会创建一个栈帧用于存储局部变量表, 操作数栈, 动态链接, 方

2017-04-04 14:39:39 525

原创 java虚拟机_04程序编译与代码优化

Java语言的”编译器”其实是一段”不确定”的操作过程, 因为它可能是指一个前端编译器(其实叫”编译器前端”更准确些)把.java文件转变为.class文件的过程, 也可能是指虚拟机的后端运行期编译器(JIT编译器)把class文件转变为机器码的过程.1、编译过程大概可以分为3个过程: 1、解析与填充符号表的过程; 2、插入式注解处理器的注解处理过程; 3、分析与字节码生成的过程;

2017-03-31 23:35:16 363

原创 HashMap与LinkedHashMap

http://www.admin10000.com/document/3322.html 刚看完,赶紧记录一下, 看看是否能把知识梳理一哈; 关于装填因子的取值以及扩容的问题, 我打算放在最后面讲;1.HashMap():1. 构造函数2. put(K key,V value);3. get(K key);1、构造函数:1. HashMap();2. HashMap(int capacit

2017-03-30 12:48:42 821

原创 深入理解java虚拟机_05高效并发

1.概念:1、指令重排序: 为了使得处理器内部的运算单元能尽量被充分利用, 处理器可能会对输入代码进行乱序执行优化, 处理器会在计算之后将乱序执行的结果重组, 保证该结果与顺序执行的结果是一致的, 但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致, 2.内存间交互操作:

2017-03-28 22:59:38 308

原创 Glide_01缓存

快速定位缓存Glide createGlide(Context context) { if (sourceExecutor == null) { sourceExecutor = GlideExecutor.newSourceExecutor(); } if (diskCacheExecutor == null) { diskCacheExecuto

2017-03-28 19:28:52 306

原创 数据结构与算法_基础概念

算法:一定要保证有穷性 程序不一定是算法, 不一定能保证程序有穷性1.公式:1、调和级数: h(n) = 1+1/2+1/3+1/4+…+1/n = O(logn)2、对数级数: log1+log2+log3+…+logn = log(n!) = O(nlogn)2.策略: 1、减而治之: 2、分而治之:3.排序: 1、冒泡排序: 2、并归排序:

2017-03-24 08:41:17 954

原创 Glide_三级缓冲

1.基本概念:单位矩阵:1, 0, 00, 1, 00, 0, 1 2. setXXX: 每次调用该方法,Matrix都会先重置为单位矩阵,然后再调用setXXX对应的方法. 3. preXXX: 前乘,例如:matrix.preScale(sx, sy);实际运算为:1, 0, 0 sx, 0, 0 sx, 0, 00, 1, 0 * 0, sy, 0

2017-03-22 19:54:04 421

原创 深入理解Java虚拟机_03虚拟机执行子系统

1. 编译阶段的常量传播优化 :public class ConstClass{ static { System.out.println("ConstClass init"); } public static final String HELLOWORLD = "hello world";}public class Test { publi

2017-03-20 23:42:52 223

原创 Java数据结构_散列

1、什么样的散列函数hash()更好: 1、确定: 同一关键码总是被映射至同一地址; 2、快速: expected-O(1); 3、满射: 尽可能充分地覆盖整个散列空间; 4、均匀: 关键码映射到散列表各位置的概率尽量,可有效避免聚集现象;

2017-03-20 08:33:42 293

原创 注解

注解相关的类位于java.lang.annotation包下: 1.元注解:作用:对其他annotation类型作说明;分类:1. @Target2. @Retention3. @Documented4. @Inherited@Target: 说明Annotation所修饰的对象范围,官方文档也作了说明: Annotation所修饰的内容由枚举ElementType决定:

2017-03-18 19:56:52 216

原创 EventBus

以前试着看过Android其他源码, 后来感觉是一脸懵逼, 并且经常是只顾着把代码意思搞懂就以为完事, 然后没过多久就忘了, 这次看源码看了些资料, 发现如果能试着去理解作者的套路, 效果或许会好一些, 并且可能会学到点儿技巧. EventBus源码其实挺简单, 类的数量也不多.1.从一个小demo开始:其实平时工作中用到最多的也就是这几个方法;2.试着分析源码:EventBut.getDefau

2017-03-16 16:31:34 356

原创 C文件输入输出流

NDK开发时, 文件读写经常是放在C中编写, 然后由Java通过jni调用执行.所以接下来写个文件读写的小demo. 一般会用到以下几个函数:1. fopen(const char* arg1, const char* arg2);2. fwrite(const void* arg1, size_t arg2, size_t arg3, FILE* file);3. fseek(FI

2017-03-12 12:51:20 461

原创 Java与底层数据类型关系

但是实际工作中肯定不可能每次都让你返回个int类型; 我们先来两张表: Java基本数据类型 Java类型 JNI类型 C/C++类型 大小 boolean jboolean unsigned char 8位 byte jbyte char 8位 char jchar unsi

2017-03-09 22:05:03 631

原创 NDK系列(1)入门级demo

说点儿题外话, 前端时间一直在纠结到底是该转行去学java后台还是从C/C++开始然后深入音视频开发或者 驱动开发. 最终还是下定决心从C/C++开始搞起. 本文学习C/C++是以NDK开发的模式去学习, 并不是单纯的学习C/C++. Android Studio2.2以后, NDK开发是很简单了, 简单到可以一键生成c层代码.首先创建工程 然后剩下的就按正常创建工程一样即可. 创

2017-03-08 23:06:02 289

原创 树知识累计

路径: 根节点到某节点的一条路线; 深度: 根节点到某节点的长度; 内部路径长: 所有节点深度总和; 高: 节点到树叶的长度; http://blog.csdn.net/pililipalalar/article/details/51980989 二叉查找树: 任一节点均不小于/不大于其左/右后代. 节点16左子树所有节点都不大于16, 右子树所有节点都不小于16, 这个就

2017-03-08 08:40:07 316

原创 C语言基本api笔记

1.memset()与memcpy :1. memset():void* memset(void*s,int c, size_t n);将c赋值给数组s中每个元素;2. memcpy():void* memcpy(void* s, const void* a,size_t n);demo:memset有清空数组的作用:#include<stdio.h>void main(){ i

2017-03-05 22:41:41 2081

原创 javaee的增删改查

1.JDBC编程步骤:1.装载驱动程序; 2.建立连接; 3.操作数据; 4.释放资源;2. 装载驱动程序:Jdbc程序中的DriverManager用于加载驱动, 并创建与数据库的连接, 常用方法: 1. DriverManager.registerDriver(new Driver()); 2. DriverManager.getConnection(url, user, passwo

2017-03-02 08:41:20 6654

原创 网络基础知识

1.SSH:

2017-03-01 20:14:23 355

原创 第三章 表,栈,队列

在实践中如果知道变动将要发生的地方, 那么向链表插入或从链表中删除一项的操作不需要移动很多的项, 而只涉及常熟个节点链的改变;双链表:

2017-02-25 12:51:14 291

原创 策略模式

策略模式主要用来分离算法, 在相同的行为抽象下有不同的具体实现策略. 这个模式很好的演示了开闭原则, 也就是定义抽象, 注入不同的实现, 从而达到很好的可扩展性. 优点: 1. 结构清晰明了, 使用简单直观; 2. 耦合度相对而言较低, 扩展方便; 3. 操作封装也更为彻底, 数据更为安全; 缺点: 随着策略的增加, 子类也会变得繁多; mvp引用了策略模式的思想: 需求: 选择交

2017-02-25 12:31:11 218

原创 启动模式

启动模式

2017-02-24 11:19:24 259

原创 原型模式

原型模式

2017-02-23 23:31:04 291

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除