- 博客(131)
- 收藏
- 关注
原创 AIDL的原理实现
前言Binder 驱动是基于 CS 模型设计的跨进程通信驱动, 想要使用 Binder 驱动进行通信, 需要三个步骤定义交互规范服务端实现客户端实现一、 定义交互规范public interface IService extends IInterface { /* 跨进程提供服务的接口描述 */ String DESCRIPTOR = IService.class.getName(); /* 跨进程提供服务的接口中 getServic
2022-02-08 16:45:42 1996
原创 Java多线程编程技术总结
目录1、StackTraceElement[] getStackTrace()方法2、推出线程的3中方式:2.1、判断线程是否中断?3、interrupt()4、stop()5、suspend()和resume()6、yield()7、线程优先级8、守护线程9、Synchronized实现原理10、脏读(dirty read)11、可重入锁12、同步方法的弊端,同步代码块的优势13、对象锁14、类Class的单例性15、String常量池.
2020-08-12 17:21:22 1245
原创 Kotlin进阶-11-Activity启动后的视图加载分析
1、介绍Kotlin进阶-9-setContentView源析+Window、Activity、DecorView关系Kotlin进阶-10-Activity的启动流程前面两节分别介绍了Activity的启动流程,还有我们的Activity上有了PhoneWindow之后我们怎么将Activity的xml布局添加到这个PhoneWindow之上的。接下来我们将当Activity启动之后,怎么将我们的Window(PhoneWindow是Window的实现类)添加到Activity上的,..
2020-06-03 10:27:39 573
原创 Kotlin进阶-10-Activity的启动流程
1、介绍Activity的启动过程分为两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。根Activity指的是应用程序启动的第一个Activity,因此根Activity的启动过程一般情况下也可以理解为应用程序的启动过程。普通Activity指的是除应用程序启动的第一个Activity之外的其他Activity。根Activity的启动过程比较复杂,因此这里分为 3 个部分来讲,分别是 :1、Launcher 请求 AMS 过程;2、AMS 到 Appli
2020-05-27 17:23:46 1353
原创 Kotlin进阶-9-setContentView源析+Window、Activity、DecorView关系
1、介绍在我们Android可见的窗口中,我们每一个Activity都包含一个Window对象,Window对象通常由PhoneWindow实现 PhoneWindow:将Decoriew设置为整个应用窗口的根View。是Window的实现类。它是Android中的最基本的窗口系统,每个Activity 均会创建一个PhoneWindow对象,是Activity和整个View系统交互的接口。 DecorView:顶层视图,将要显示的具体内容呈现在PhoneWindow上. Dec...
2020-05-13 15:59:43 936
原创 Kotlin进阶-8-View的事件分发详解
1、介绍View的事件分发机制,其实就是手指触摸屏幕造成的事件(点击、滑动、长按等)的传递规则,而传递对象就是MotionEvent,View的事件分发机制其实就是研究MotionEvent的传递规则。点击事件的分发过程由三个很重要的方法共同完成:dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()注意:onIn...
2020-05-09 17:51:41 691
原创 Kotlin进阶-7-阻塞队列+线程池
6、阻塞队列阻塞队列常用于生产者和消费者的场景,生产者是往队列中添加元素的线程,消费者是从队列中拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器中拿元素。6.1、常见阻塞场景阻塞队列和普通队列不同地方在于,它会阻塞线程,而常见的阻塞场景有如下两种:1、当队列中没有数据的情况下,消费者端的所有线程都会被阻塞(挂起),直到有数据放入到队列中。2、当队列中...
2020-05-08 16:32:38 5104 1
原创 Kotlin进阶-6-重入锁+synchronized+volatile
1、介绍进程:进程是操作系统结构的基础,是程序在一个数据集合上运行的过程,使系统进行资源分配和调度的基本单位。进程可以被看作程序的实体,同样,它也是线程的容器。2、线程的状态Java线程在运行的声明周期中,可能处于6种不同的状态:New:新创建状态-----线程被创建,但是还没调用start()方法。Runnable:可运行状态-----一旦调用了st...
2020-05-07 17:42:11 12448 2
原创 Kotlin进阶-5-View的滑动与动画
目录1、View介绍1.1、View.getTranslationX()和View.getX()1、View介绍在Android 中View的位置由四个属性来决定:left、top、right、bottom。left: View 左上顶点相对于父容器的长度 top: View 左上顶点相对于父容器的高度 right: View 右下顶点相对于父容器的长度 bo...
2020-04-28 19:01:21 1266
原创 Kotlin进阶-4-Bitmap压缩与缓存
* 1.质量压缩像素点 ABCD压缩后AAAA* 原理:通过算法抠掉(同化)了图片中的一些某个些点附近相近的像素,达到降低质量介绍文件大小的目的。 * 减小了图片质量 * 注意:它其实只能实现对file的影响,对加载这个图片出来的bitmap内存是无法节省的,还是那么大。 * 因为bitm...
2020-04-26 17:23:27 2427
原创 Koltin进阶-3-HandlerThread + IntentService
目录1、HandlerThread1.1、使用1.2、源码1、HandlerThreadHandlerThread 继承于Thread,其实他就是一个线程,与普通线程不一样的地方是它在内部加载了Looper,方便我们为该线程创建一个Handler。1.1、使用1.2、源码public class HandlerThread extends Thread {...
2020-04-23 14:12:43 585
原创 Koltin进阶-2-源码实现-AsyncTask
目录1、背景2、简介2.1、详解2.2、使用1、背景在Android中,除了Thread扮演线程角色以外,还有AsyncTask、HandlerThread、IntentService同样可以担当起异步线程的任务,它们各自有自己的适用场景。AsyncTask:封装了Handler和线程池,它主要是为了方便开发者在子线程中更新UI;HandlerThread:简化了...
2020-04-22 19:29:36 347
原创 Kotlin进阶-1-消息传递机制-Handler
ThreadLocalMap是自定义的哈希映射,仅适用于维护线程局部值。 没有操作导出到ThreadLocal类之外。 该类是包私有的,以允许声明Thread类中的字段。 为了帮助处理非常长的使用寿命,哈希表条目使用WeakReferences作为键。 但是,由于不使用参考队列,因此仅在表空间不足时,才保证删除过时的条目。...
2020-04-21 14:51:42 3239
原创 RxJava3源码实现-5-流控制
目录1、背景2、sample()-定期采样「throttleFirst()+throttleLast()」3、buffer()-批量处理1、背景在异步处理的前提下, 我们的Observable.create()发布数据的数据有可能快于Observer处理的速度。这就导致Observer来不及接收所有事件,从而导致Observer无法及时响应 / 处理所有发送过来事件的问...
2020-04-17 15:54:08 618
原创 RxJava3源码实现-4-flatMap()
目录1、介绍1.1、适用场景1.2、代码实现2、手写实现2.1、flatMap()调用2.2、flatMap()触发3、代码1、介绍FlatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable。注意1:FlatMap对这些Observables发射的数据做的是合并(merg...
2020-04-15 17:09:29 834
原创 RxJava3源码实现-3-线程调度「subscribeOn()+observeOn()」
目录1、介绍1.1、subscribeOn()1.2、observeOn()2、subscribeOn()原生实现3、subscribeOn()手写实现3.1、subscribeOn()执行3.2、subscribeOn()触发1、介绍在我们的RxJava中,不管是create() 或者map(),还是filter()等等吧,大部分操作符默认情况下都是没有异步...
2020-04-14 15:27:09 928
原创 RxJava3源码实现-2-map操作符+解析数据流实现
1、介绍RxJava3手写实现-1-create()+subscribe()已经对我们的create()和subscribe()函数进行了实现讲解,这里就不做介绍了。手写实现的源码地址。map()函数的作用:就是将我们输入的数据类型进行转换。可以将Integer类型转换成String类型,也可以在原数据类型上进行值的修改。2、map()1、map()函数中会new...
2020-04-13 10:22:27 590
原创 RxJava3源码实现-1-create()+subscribe()
目录1、代码调用流程图1.1、create()1.2、subscribe()2、代码2.1、结构目录2.2、代码一2.3、代码二3、输出3.1、原生输出3.2、手写输出1、代码调用流程图从下图中我们可看到:1、调用create()方法会new 一个ObservableOnSubscribe对象,并将这个对象传到了ObservableCreate...
2020-04-10 16:36:12 632
原创 Java基础进阶-7-序列化+解序列化+文本存储
1、内部类内部类可以使用外部类的所有方法和变量,即使是私有的。 内部类的实例一定会绑在外部类的实例上。 内部类的作用:让一个类(外部类)可以实现同一个接口的多次。或者让一个类可以继承父类多次。-------这样做的目的:就是为了让一个类可以保持接口的多种不同状态。...
2020-04-07 14:29:55 236
原创 Java基础进阶-6-Exception
1、继承关系我们常见的Exception都继承于Throwable类,除了我们无法控制OOM异常的Error分类外,我们可以接触到的异常主要分为两类:1、运行时异常(非检查异常);2、非运行时异常(检查异常)2、异常处理对于RuntimeException,我们一般是不需要处理的,因为大部分的RuntimeException都是因为逻辑问题导致的,就必须ArrayIn...
2020-04-03 14:15:58 242
原创 Java基础进阶-5-static+final+格式化(时间)
1、static属性静态的方法是无法调用非静态变量的; 同一类的所有实例共享一份静态变量; 静态变量会在类第一次被加载的时候被初始化。类会被加载是因为Java虚拟机认为它该被加载,通常,Java虚拟机会加载某个类是因为第一次有人要尝试创建该类的新实例,或是使用该类的静态方法或变量。 静态变量会在该类的任何对象创建之前就完成初始化; 静态变量会在该类的任何静态方法执行之前就初始化完成。...
2020-04-01 18:55:32 269
原创 Java进基础阶-4-对象内存、存活、回收+构造函数
java 内存划分 Android内存分配(主要):堆、栈、静态区栈: 局部变量中的基本数据类型直接存入栈中局部变量中对对象的引用(指针)存在栈中堆:成员变量全部存在堆中(包括:基本数据类型、对象引用和对象引用的实例)【成员变量属于类,类最终都是要被new 出来的,所以成员变量全部存储在堆中】...
2020-03-31 18:52:50 151
原创 Java基础进阶-3-继承与多态
目录1、继承2、多态-继承3、多态-抽象4、多态-接口1、继承1、成员public类型的成员会被继承private 类型的成员不会被继承子类是无法覆盖掉父类的实例变量的。2、重写重写父类的方法,相当于重新定义该方法。如果你想要重新定义该方法还想要继续运行父类该方法的行为,那么需要运用super。3、final被 final修饰的类和方法不能...
2020-03-25 17:51:54 252
原创 Java基础进阶-2-运算符+ArrayList
1、前置/后置 ++前置 ++ 代表 先执行加法操作,再运用变量的值。前置一般只有在下面这样的情况运算才有意义。 int x=0; int z= ++x; //输出结果 x z都是1后置就是先运用变量的值,再做加法操作。 int x=0; int z= x++; //输出结果 x=1; z=0;我们常在for循环中添加 ++,但是前置和后置都是...
2020-03-25 17:30:24 256
原创 Java基础进阶-1-变量与对象(回收+内存占用)
1、定义变量就是用一个数据类型和一个名字声明的。比如: String name; name就是一个变量。变量有两种:原始数据类型 和引用。2、原始数据类型原始数据类型指的是 8种数据类型:byte、char、short、int、long、float、double、boolean。注意:float f=32.5f。 其中“f”。除非加上f,否则所有带小数点的值,都会被Ja...
2020-03-25 13:59:03 430
原创 算法-25-正则表达式
目录1、定义1.1、连接操作1.2、或操作1.3、闭包操作1.4、准确定义2、特殊记号2.1、空字符串2.2、括号2.3、转义字符1、定义在我们日常编程中, 使用正则表达式最多的地方就是对账户密码字符的限定了,还有就是在一个文本中查找指定的子字符串。我们的正则表达式由3种基本操作和作为操作数的字符组成。1.1、连接操作我们普通的所...
2020-03-24 17:07:02 854
原创 算法-24-子字符串查找(暴力+KMP+BM+RK)
1、定义子字符串查找:给定一段长度为 N 的文本和一个长度为 M 的模式 (pattern)字符串,在文本中找到一个和该模式相符的子字符串。解决该问题的大部分 算法都可以很容易地扩展为找出文本中所有和该模式相符的子字符串、统计该模式在文本中的出现次 数、或者找出上下文(和该模式相符的子字符串周围的文字)的算法。2、暴力子字符串查找子字符串查找的一个最显而易见的方法就是遍历文本...
2020-03-24 11:11:25 1280
原创 算法-23-单词查找树(字符串搜索最快算法)
1、各种字符串查找算法性能比较假设这里有N个名字,我们需要找到自己的名字的话,并得到自己的分数的话,最简单的方法是遍历这N个字符串,直到找到自己的名字,但是我们也可以用下图中的算法来缩短我们查找的时间。算法-13-符号表(HashMap的前世一)算法-14-二叉查找树(HashMap的前世二)算法-15-平衡查找树算法-16-红黑树算法-17-散列表(拉链法+线性探测法...
2020-03-19 18:22:12 3452
原创 算法-22-字符串的排序算法(四种排序)
目录1、字符串1.1、属性1.2、字母表2、字符串排序方法3、键索引计数法3.1、第一步:频率统计3.2、第二步:将频率转换为索引3.3、第三步:数据分类排序3.4、第四步:回写排序好的数组4、低位优先的字符串排序5、高位优先的字符串排序1、字符串String 是由一系列字符组成的。字符的类型是 char,可能有 2的16次方个值。数十年以来,...
2020-03-17 16:38:05 31532
原创 Fresco-4种方案教你降低内存使用
目录1、背景2、Fresco的三级缓存2、优化方案一:设置缓存策略3、方案二4、优化方案4--2.在列表中加载图片时,重置size,避免单张图片过大:5、方案4-----(比较暴力的方式)记录你加载的图片链接,然后在必要的时候强制清除:1、背景fresco使用,如果列表图片比多,会特别消耗内存,所以必须进行优化依赖环境2、Fresco的三级缓存...
2020-03-13 20:07:01 2706
原创 算法-21-最短路径(Dijkstra+最优算法+Bellman-Ford)
目录1、定义1.1、性质2、数据结构2.1、有向边的代码2.2、加权有向的图的代码3、核心思想4、Dijkstra算法5、求最短路径的最优算法6、通用最短路径算法1、定义我们生活中经常会使用地图来查找我们到达目的的路线,而我们希望每次走的都是最短路线,而我们这一节将要学习的就是在一个图中,寻找a点到b点的最短路径。最短路径: 找到从一个顶点到达...
2020-03-12 21:29:17 2426 1
原创 算法-20-最小生成树+贪心算法(Prim+Kruskal)
1、定义加权图是一种为每条边关联一个权值或是成本的图模型。一幅加权图的最小生成树(MST) 是它的一棵权值(树中所有边的权值之和)最小 的生成树。...
2020-03-09 13:45:03 1237
原创 算法-19-有向图(拓扑排序+最短路径)
1、定义一幅有方向性的图(或有向图)是由一组顶点和一组有方向的边组成的,每条有方向的 边都连接着有序的一对顶点。1.1、应用1.2、术语一个顶点的出度为 由该顶点指出的边的总数;一个顶点的入度为指向该顶点的边的总数。2、数据结构有向图的数据结构和无向图的数据结构基本一样,区别在于无向图在addEdge时会将两个顶点互相连接,而有向图只能按照指定方向将这两...
2020-03-07 20:56:52 3749
原创 算法-18-无向图(深度+广度优先搜索)
目录1、定义1.1、特殊的图1.2、术语2、无向图的数据结构2.1、数据结构API2.2、代码3、深度优先搜索3.1、深度优先搜索代码3.2、深度优先搜索路径代码4、广度优先搜索---寻找最短路径4.1、代码5、连通分量5.1、代码6、检查图中是否有环7、二分图(二分颜色)1、定义图是由一组顶点和一组能够将两个顶点相连的边组成的...
2020-03-03 21:48:45 2707
原创 算法-17-散列表
目录1、散列表2、散列函数2.1、整数-除留余数法2.2、浮点数2.3、字符串2.4、Java-哈希函数1、散列表散列表其实就是用一个数组来存储我们的键值对,在存储过程中,我们会将key通过散列函数将转换为数组的索引index,然后将value存储在数组的该索引下。当然我们在存储过程中会遇到不同的key通过相同的散列函数转换成的索引index是相同的情况,这时...
2020-02-22 16:46:31 619
原创 算法-16-红黑树
目录1、定义2、特点3、完成代码4、旋转---rotateLeft()5、向一棵2-结点树中插入新键---put()6、向树底部的2-结点插入新键---put()7、向一个3-结点中插入新键---flipColors()8、向树底部3-结点插入新键9、put()---插入规则10、红黑树的构造轨迹1、定义通过前面算法-15-平衡查找树的学习,我们了...
2020-02-18 15:07:59 388
原创 算法-15-平衡查找树
目录1、背景2、2-3查找树3、查找4、向2-结点树中插入新键5、向3-结点树中插入一个新键6、向一个父结点为2-结点的3-结点树中插入新键7、向一个父结点为3-结点的3-结点树中插入新键8、分解根节点9、4-结点分解的6种情况10、2-3树的构造轨迹1、背景前面我们讲到,使用二叉查找树的算法的运行时间取决于树的形状,而 树的形状又取决于键被插入的...
2020-02-08 17:11:04 250
原创 算法-14-二叉查找树(HashMap的前世二)
目录1、定义2、特点3、查找(get)4、插入(put)5、完整代码1、定义一棵二叉查找树(BST)是一棵二叉树,其中每个结点都含有一个 Comparable的键(以 及相关联的值)且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点 的键。下面是对二叉查找树的图解和结点Node的代码实现。2、特点一棵二叉查找树代表了一组键(及其相应的值...
2020-02-05 22:42:53 349
原创 算法-13-符号表(HashMap的前世一)
目录1、定义2、用途3、特点4、方案一:基于无序链表5、方案二:基于有序数组的二分查找6、符号表的各种实现的优缺点1、定义符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值 对存入表中;查找(get),即根据给定的键得到相应的值。2、用途符号表主要的目的就是将一组键和值对应起来,并将多组键值对存储起来,方便后期查找的时候我...
2020-02-05 21:27:34 377
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人