自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android View优化策略与分析

主要需要注意两点1、一个是在复杂布局场景,如果在较为简单的能够通过FrameLayout或者LinearLayout实现的,则无需使用ConstraintLayout,比如使用不同布局的嵌套层数是相等的。2、 一个是尽量使用ConstraintLayoutConstraintLayout被推荐使用的主要原因有两点使用ConstraintLayout时,目的是为了减少嵌套,不然灵活性的优势不能体现,与其他的ViewGroup书写性能差异就不大了,甚至是弱于部分布局,比如Framelayout。

2023-06-02 12:06:38 282

原创 源码阅读系列——基础篇(Android SparseArray 集合源码分析)

之前我们了解了很多JAVA的集合源码分析,我们继续开坑学习Android集合源码实现1、构造函数public class SparseArray<E> implements Cloneable { private int[] mKeys; // 存放key的数组 private Object[] mValues; // 存放value的数组 private int mSize; public SparseArray(int initialCapacity)

2020-10-02 16:05:45 151

原创 源码阅读系列——进阶篇(Android的线程分析)你是否真的了解线程

1、线程概念我们知道,在linux系统里,有进程和线程的概念。进程是linux最小的资源管理单位,而线程时最小的执行单元。进程与线程不一样,他拥有自己独立的内存空间,而线程则是共享进程的内存空间。所以,相对而言,会更好的利用资源。当然,学习过linux内核的人,也知道,不管是线程还是进程,在内核中都理解为进程,因为linux内核本身在cpu调度的时候,进程为最小单元,所以线程在内核中表现为一个轻量化的进程,而至于用户态下线程的管理,则是通过进程首次建立就自动创建的管理线程进行管理,例如线程的停止,线程的

2020-09-06 20:55:14 374

原创 三方库详细解读——BlockCanary的实现

综述之前,我们讲解了LeakCanary的源码,有兴趣的同学可以参考解析:https://blog.csdn.net/luoluofeixia/article/details/107494261本节讲解一下分析UI卡顿的SDK——BlockCanary。初始化正常我们使用BlockCanary进行初始化,涉及到构造函数以及install方法:private BlockCanary() { BlockCanaryInternals.setContext(BlockCanaryContext

2020-08-20 14:43:26 865

原创 详细解读Android Handler中Native挂起唤醒逻辑实现

简述如果没有阅读过上篇Handler机制解析的,可以先翻看上篇wiki:https://blog.csdn.net/luoluofeixia/article/details/107544100我们知道MessageQueue中,每次在next(),取message的时候,如果没有message了,他就会处于挂起状态(这样做的目的),当有消息到来,或者下一个消息的时间到达之后,都会唤醒线程,那么这个是如何实现的呢。挂起线程jni方法Java层定义private native void native

2020-08-18 17:48:31 986

原创 详细解读Android Handler机制

1、你是否真的了解Handler机制很多同学如果只看过博客的解析,可能没有完全了解到整个Handler机制中的实现,我们了解Handler不能浮于表面,在面试的过程中,发现很多同学并没有从根本上了解这一机制,此篇文章我们去好好捋一捋,重新认识一下他的实现。2、Looper我们写过JAVA知道,他总是由一个 public static void main(String[] args)方法开始的,同样我们通过zygote fork的进程也是由此法开始。按照进程的规则,会伴随一个主线程的创建,而我们在mai

2020-07-24 20:18:30 176

原创 三方库详细解读——LeakCanary的实现

综述我们知道LeakCanary是用来检查Activity和Fragment是否存在内存泄漏的。那么他是如何监测的呢?我们本篇文章就来解析监测生命周期监测Activity生命周期public final class ActivityRefWatcher { public static void install(@NonNull Context context, @NonNull RefWatcher refWatcher) { Application application = (Ap

2020-07-21 18:05:52 221

原创 WindowManager窗口添加管理流程分析一

WindowManagerService窗口添加管理流程分析Api中窗口定义与使用WindowManagerService初始化新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入Api中窗口定义与使用我们知道Android

2020-07-15 16:54:41 442

原创 android 内存消耗分析

1、如何查看memory 的总消耗linux的命令top -h 以及PS 都可以查看到内存PSS和VSS的内存消耗。android提供了工具,可以更全面的分析到内存的分布情况。先看procrank,这个工具没有,可以通过下载编译放在android /system/xbin/目录下。然后分别执行:adb rootadb shell procrank我们看一下内存分布结果: PID Vss Rss Pss Uss Swap PSwap US

2020-07-10 16:39:31 1911

原创 Android 9.0——ActivityManagerService代码分析

1、AMS初始化9.0的代码google同样做了一些改变,但是大体的流程与8.0接近。ActivityManagerService同样通过SystemServer启动(Zygote孵化),我们看一下实现。首先定位SystemServer的主线程的方法:public static void main(String[] args) { new SystemServer().run();}我们看一下run方法执行了什么:private void run() {// 省略代码,主要是一些系统

2020-07-07 23:33:58 774

原创 源码阅读系列——基础篇(ConcurrentHashMap 集合源码分析)

上篇我们讲到HashMap,从整个代码的实现上,我们看到没有任何一个关于synchronized或者Lock的字眼,所以HashMap是线程不安全的,Java提供了一个线程安全的HashMap,当然也可以通过Collections.synchronizedMap来实现Map线程安全,与List里面提到的方式一样,也是很暴力的直接给每个读取方法加一个synchronized字段,这里不再赘述。我们讲一下Java的线程安全利器ConcurrentHashMap1、类定义public class Concur

2020-06-17 16:39:55 152

原创 源码阅读系列——基础篇(HashMap 集合源码分析)

HashMap是一种插入、查询效率都较高的集合,我们看一下他是如何实现的。首先我们以插入数据来看一下源码:1、插入数据// 获取对象的hash值,至于什么hashcode,见注1static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}public V put(K key, V value) { retur

2020-05-29 17:34:28 159

原创 源码阅读系列——基础篇(CopyOnWriteArrayList 集合源码分析)

CopyOnWriteArrayList是一个线程安全的List,使用较少,我们看一下他的实现。1、类定义public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { final transient Object lock = new Object(); // 对象锁 private transient vol

2020-05-22 17:58:26 99

原创 源码阅读系列——基础篇(LinkedList 集合源码分析)

LinkedList与ArrayList同样都是线程不安全的集合,那么他跟ArrayList有何区别。我们还是从源码来看1、类定义public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; // 元

2020-05-22 15:03:00 126

原创 源码阅读系列——基础篇(ArrayList 集合源码分析)

ArrayList是我们非常常用的一个线程不安全的List集合。ArrayList和Vector大体比较相似。我们继续阅读源码找答案。1、类定义public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final int DEFAULT_C

2020-05-22 12:06:17 171

原创 源码阅读系列——基础篇(Vector 集合源码分析)

我们知道Java有一个不常用的集合类Vector。因为他使用一种非常暴力的方式实现线程安全。我们看一下他的基本实现1、类定义public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ protected Object[] elementData; // 元素数组 pro

2020-05-22 11:13:16 155

原创 后序遍历非递归的自我理解

我们看一下递归的方法,来反推非递归的方法1、递归方法二叉树节点class TreeNode { TreeNode left; TreeNode right; int val;}递归方法class Solution { List<Integer> list = new ArrayList<Integer>(); public List<Integer> postorderTraversal(TreeNode root) {

2020-05-21 18:26:59 251

原创 Chromium 81版本编译webview

1、Debug和Release版本webview是可以编译debug和release版本的。如果只是在调试的话,一定要以默认的debug编译,因为webview的release版本,最终会把所有的动态库合成一个libwebviewchromium.so。而debug版本,则把每一个module的功能都区分成了很多个cr.so(例如libblink_core.cr.so)。2、关于H264的支持默认情况下,webview编译出来就已经支持H264了,但是是硬解,如果需要软解,需要打开,也就是参数直接增加

2020-05-15 11:50:36 2182

原创 6、Kotlin的函数

本节我们讲kotlin的函数,在java中,我们也会称为方法,1、函数的写法我们先看最普遍的写法,这三种写法区别仅仅在参数:fun print(){ print("hello world"); // 无参}fun print(str:String){ print("hello world $str"); // 有参}fun print1(str:Strin...

2020-04-13 18:16:36 204

原创 5、Kotlin的lambda表达式

Lambda表达式,在kotlin中,使用范围非常广。高阶函数、内联函数、委托属性等方式都要基于对lambda的理解。kotlin的lambda与java一脉相承,却不尽相同。1、lambda表达式概念lambda表达式在kotlin中是可以理解是一个可以复用的代码块。可以被其他的函数调用。2、lambda代码书写一个Lambda表达式把一小段行为进行编码,你能把它 当做值到处传递,它可以...

2020-04-13 15:21:00 231

原创 4、Kotlin数据类型

1、基本数据类型1.1、数据类型介绍kotlin没有区分包装类和数据类型,他只有统一的数据类型。1.2、数据类型与java不对等但是kotlin里面的数据类型,不能完全的去对等java中的数据类型和包装类,举一个简单例子:fun getInt1(): Int { // 默认不可为null,函数的书写后一讲会表述 return 0}fun getInt2(): Int? ...

2020-04-09 16:38:26 222

原创 3、Kotlin基本语法

1、定义变量var number : Int = 10;val str : String = “test”;var number1 = 10f;val str2 = “test”;看一下java编译结果:private static int number = 10;@NotNullprivate static final String str = “test”;private ...

2020-04-09 16:24:40 118

原创 2、Android studio中搭建kotlin

1、首先需要增加kotlin的依赖项增加依赖项classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”2、配置gradle,我们需要确认gradle的版本,由于kotlin最低需要gradle4.9以上才能构建,所以确认两处gradle配置其一是gradle的依赖再者就是gradle的版本,与依赖当然...

2020-04-03 12:43:15 299

原创 1、Kotlin语言-简述

1 、 简介kotlin语言是一种全新的语言,虽然他是一种运行在jvm上的语言,他基本上可以java对等,不过除此以外,kotlin又是很灵活的,他可以编译成运行与其他平台的语言,所以他可以应用在很多场景并且在多个集成环境可以被使用,例如IntelliJ IDEA、eclipse等都可以使用,而且只要借助于构建工具,可以实现各种功能,以IntelliJ IDEA为例:2、JAVA 和 K...

2020-04-03 12:07:59 568

原创 Kotlin语言

1、Kotlin语言目录目录Kotlin语言-简述

2020-04-03 12:02:42 88

空空如也

空空如也

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

TA关注的人

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