自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android启动流程学习笔记

在attach方法里面 创建IApplicationThread binder接口 之后调用AMS的attachApplication 将IApplicationThread接口传进去 在AMS里面会去校验启动参数 校验通过后 将进程的信息(比如有进程名,appInfo,providers)通过传进去的IApplicationThreadd的bindApplicion方法传出来。idle进程pid=0 他会创建两个进程 一个是init进程 一个是kthread进程。

2024-01-26 14:34:58 630

原创 记签名机制

.SF:对前一步生成的 MANIFEST.MF,使用 SHA256-RSA(JDK7.0之前采用 SHA1算法) 算法,用私钥进行签名,其中的值是对清单文件里的 SHA256 再进行 SHA256 后再次 base64 得到。*.RAS:生成 MANIFEST.MF 没有使用密钥信息,而生成 .SF 文件使用了私钥文件。接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致。首先将数据源通过摘要算法获取到数字摘要。对数字摘要用私钥进行加密得到签名。

2024-01-26 10:13:50 701

原创 记 Rxjava zip操作符遇到的问题

zip实现就是给传入的那些Observablef分别注册了一个zipObserver,然后在zipObserver里面是将发射的数据存在了一个queue里面,接着for循环去取queue里面的数据 如果不为空 将把数据存在了一个object[]里面,只要有一个Observable没有发射数据 就不会去分发这个object[] 如果都不为空 才去调用zipper的apply,参数就是这个object[]发现他只走了三个Observable流, 并没有去处理这些Observable返回的数据。

2024-01-25 17:45:45 885

原创 记View onTouch onClick onLongClick如何触发

在view的daipatchTouchEvent()中,当有事件来临时如果onTouchEventListener不为空,并且view enable为true时,就会调用onTouch() 所以当点击某个按钮又抬起时 会调用两次onTouch, down事件一次,up事件一次,如果有滑动屏幕时,会调用多次,因为会一直产生move事件。在Up事件处理时会去判断 如果onLongClick如果没有被触发或者onLongClick返回false,将长按计时取消 然后去触发onClick。

2024-01-21 12:17:02 400

原创 面试之Glide如何绑定Activity的生命周期

整个流程调用Glide.with时首先获取到Glide单例中的RequestManagerRetriever,再调用retriever的get(),再他的get方法中创建了一个无界面的Fragment并且注册给Activity,然后将这个Fragment里面的LifeCycle传递给要返回的RequestManager,在这个RequestManager中给LifeCycle注册了一个观察者,这样就完成了生命周期在Activity->Fragment->RequestManager之间的传递;

2024-01-19 10:12:52 546

原创 RecyclerView事件拦截

RecyclerView对三种事件的处理:down事件:如果当前处于自动滚动状态,则拦截事件,停止滚动,否则分发给子viewmove事件:如果当前处于正在滑动状态直接拦截,否则判断水平位置与竖直为滑动距离是否超过最小滑动距离(mTouchSlop),超过则拦截,否则不拦截up事件:只做了停止滑动操作,是否拦截依赖当前滑动状态。

2024-01-18 22:13:18 447

原创 Rxjava链式调用解析

这里调用的是Observable的subscribetry {//重点看这里throw e;throw npe;看到subscribeActual()方法没,原来subscribe()里会调用subscribeActual;Rxjava的链式调用整个流程就是从下到上,由上而下。

2024-01-17 16:13:56 900

原创 MVI架构理解

上面提到,intent指的是用户意图,在代码层面上来说他其实就是个枚举类,在kotlin中可以通过sealed关键字来生成封闭类,这个关键字生成的封闭类在when语句中可以不用写elseobject GetBanners: UserIntent() //定义了一个用户获取Banner的意图State是UI状态,MVI的一个特点就是数据状态统一管理,state是个和Intent一样的枚举,但是不同的是intent是个事件流,state是个状态流。

2023-05-09 10:08:01 1537

原创 关于ViewModel的理解

关于View的一些见解

2023-03-02 13:46:59 296

原创 LifeCycle源码解析

LifeCycle源码

2023-01-30 13:09:48 243

原创 Slice

Slice简单介绍

2022-10-09 13:22:15 802

原创 Activity初识

1. cactivity概念首先Acitivity可以理解为用户与应用互动的一个入口点,一个应用可以有多个Activity。当一个应用调用另一个应用时,调用方调用的是另一个应用的Activity,而不是整个应用。Activity提供窗口供应用在其中绘制界面,此窗口通常铺满屏幕,也有可能窗口小于屏幕的大小,通常一个Activity实现应用中的一个屏幕,比如一个Activity实现“偏好设置”这个屏幕,另一个Activity实现“选择照片”这一屏幕。大多数应用包含多个屏幕,这意味着它们包含多个Activi

2020-12-27 16:16:03 113

原创 公平锁与非公平锁的实现原理

公平锁:按照线程等待顺序获取锁,一般将获取锁失败的线程放入等待队列中,每次从FIFO队列的队头取出线程获取锁。这种方式会造成性能低下,大量的时间花费在线程调度上。非公平锁:不管等待顺序,每个线程获取锁的概率都是相等的,优点是提高了响应速度,不用把大量时间花费在线程调度上,而是花费在执行代码上。公平锁的实现方式:ReentrantLock lock=new ReentrantLock(true...

2019-08-25 11:21:13 3540

原创 MyISAM,INODB存储引擎索引结构

MyISAM主键索引MyISAM使用B+树作为索引结构,叶节点的data域存放数据记录的地址,下面是MyISAM主键索引的原理图:MyISAM辅助索引在MyISAM中,主索引和辅助索引在结构上没有区别,只是主索引要求关键字key的值是唯一的,而辅助索引允许key值重复。结构图如下:...

2019-08-14 16:43:38 206

原创 Mysql索引以及底层原理

索引的优缺点:索引是创建在表上,是对数据库表中一列或多列的值进行排序的一个结果。索引的核心是提高查询的速度。优点:提高查询效率。缺点:索引并非越多越好,过多的索引会使CPU的使用率居高不下,由于数据的改动会造成索引文件的改动,过多的I/O操作造成CPU负荷太重。索引的创建和删除:创建表的时候指定索引字段:CREATE TABLE index1(id INT,name VARCHAR(...

2019-08-13 16:31:08 115

原创 深入理解Mysql事务ACID特性以及事务隔离级别

事务的概念:1.事务是一组sql语句的执行,要么全部成功,要么全部失败。保证事务执行的原子性。2.事务的全部sql语句执行成功,才能提交,将结果写回到磁盘上。3.事务执行过程中,有的SQL执行失败,那么事务必须回滚到最初的状态。事务的ACID特性:事务的原子性(Automic):事务是一个不可分割的整体,事务必须具有原子性,当修改数据时,要么全部执行,要么都不执行,即不允许事务部分完成...

2019-08-09 21:15:55 470

原创 详解http协议

HTTP是什么?中文名超文本传输协议,它是一个应用层协议,是web实现各种连接使用到的协议,它依靠TCP实现可靠传输。HTTP定义了浏览器怎样向服务器请求文档,以及服务器怎样把文档响应给浏览器。HTTP是面向事务的协议,它是web进行可靠文件交换的重要基础。当客户端请求一个资源时,会先通过HTTP协议将请求的内容封装在http请求报文中,服务器接收到该请求时根据协规范对报文进行解析,然后向客户端...

2019-08-05 17:32:59 219

原创 深入理解synchronized的使用及底层原理

synchronized的使用:修饰方法:此时锁住的是当前对象实例修饰静态方法:锁住的是当前类的c lass对象,因为一个类只有一个class对象,所以synchronized加在静态方法上,相当于该类的一个全局锁。修饰代码块:锁住的是obj对象,作用在代码块中synchronized原理:synchronized的同步是基于进入和退出monitor对象实现sychronized修...

2019-08-05 11:44:02 211

原创 详解equals()和hashcode()

java的基类Object提供了两种判断对象是否相等的方法equals()和hashcode(),equals判断两对象内存地址是否相等,hashcode()判断两对象的哈希吗。equals()方法:Object类中equals方法实现如下:可以看到,只要他们是同一个对象,就会返回true.hashcode()方法:Object类中的hashcode():可看到Object中的ha...

2019-08-04 13:57:15 128

原创 IOC和DI关系以及autowired与resource的区别

什么是IOC(控制反转)?控制反转指的就是应用程序把对象的所有控制权都交给Spring容器,应用程序本身不负责对象的创建和维护,然后容器把对象的使用权反转给程序。实例化对象的两种实现方式:配置方式: 注解方式:1.通过扫描方式,扫描指定包路径下的所有注解2.对需要实例化的类添加注解:Component注解是bean类实例化提供的 注解方式。它还衍生出三个注解,Control...

2019-08-04 11:20:26 429

原创 Java并发编程中对AQS的理解

什么是AQS?全称AbstractQueuedSynchronizer(抽象队列同步器)。AQS是用于构建锁和同步器的框架,也是并发包的基础类。java并发包下很多API都是基于AQS来实现加锁和释放锁。ReentrantLock加锁和释放锁的底层原理: ReentrantLock内部包含了一个AQS对象,也就是AbstractQueuedSynchronizer类型的对象。这个AQS对...

2019-07-23 13:18:09 230

原创 java内存模型以及volatile关键字的作用

计算机内存模型:计算机执行程序时每条指令都是在CPU中执行,执行指令的同时势必会有读写操作,这样就引申出一个问题。程序运行时数据的存储是存储在计算机的主存(物理内存)的,而内存的读取和写入的速度与CPU执行指令的速度差距是很大的,这样就造成了内存交互程序的执行效率大大降低,因而CPU中就有了高速缓存。也就是说CPU在执行指令时,将主存中的数据复制到高速缓存中,将结果运算完毕,再将运算结果刷新到...

2019-07-21 12:57:01 123

原创 浅谈java内部类以及注意点

java内部类主要有四种:静态内部类:作为类的静态成员,存在于某个类的内部。静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,可以直接创建静态内部类的对象。静态内部类可以引用外部类的静态成员变量和静态方法,但不能引用外部类的普通成员。成员内部类:作为类的成员,存在于某个类的内部。成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。成员内部类中...

2019-07-21 11:57:46 456

原创 Netty解决TCP沾包拆包

对于TCP而言,当底层发送和接收消息时,都需要考虑TCP的沾包和拆包问题,一个完整的数据包可能会被TCP拆成多个包发送,或者将小的数据包封装成大的数据包发送。那么什么是TCP沾包???假如客户端分别发送两个数据包D1和D2给服务端,由于服务端每次读取的字节数是不确定的,所以存在以下四种情况:1.server端分别读取到D1和D2,没有产生沾包和拆包的问题。2.server端一次接收到...

2019-04-22 21:53:41 217

原创 浅谈JVM垃圾回收机制

垃圾回收机制:Java中引入垃圾自动回收机制,将不再被引用的对象进行回收,所以垃圾回收机制主要作用于堆内存。由于GC操作需要消耗一定的时间,java在对对象的生命周期进行分析后,按照新生代,老年代的划分对垃圾进行回收。对新生代的回收称为minor,对老年代的回收称为FULL,GC程序中调用System.gc()强制执行的GC为full,GC不同的对象引用类型,GC采用不同的方法进行回收。jav...

2019-04-15 20:05:58 231

原创 java线程池原理

我们知道当我们要使用线程的时候就去创建一个线程,这样会很方便,但是这样会有一问题:每创建一个线程,就要和操作系统进行交互,CPU会为每个线程分配资源,但是CPU的资源是有限的,如果在大量高并发的环境下,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,损耗CPU的性能**,因为频繁创建线程和销毁线程需要时间。线程的创建需要开辟虚拟机栈,本地方法栈,程序计数器...

2019-04-14 13:31:27 148

原创 TCP如何保证可靠传输???

(1)校验和TCP校验和的计算和UDP一样,在计算时要加上12字节的伪首部,检验范围包括tcp首部以及数据部分,但是udp的检验和字段为可选的,而tcp中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正确),否则存在错误。(2)序列号TCP将...

2019-04-10 21:07:36 145

原创 Reactor模型简介

Reactor模型:有一个或多个并发输入源,有一个Service Handler,有多个Request Handler;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。单线程的Reactor模型:**所有的IO操作都由一个线程完成,即多路复用,事件分发和处理都是在一个线程上完成的。**既要接受客户端的连接请求,又向服务...

2019-04-08 21:20:43 1384

原创 浅谈BIO与NIO

BIO:同步阻塞式IO,即当当前IO操作未完成时,不能进行其他操作。当服务器监听到有客户端请求连接时,就会创建一个新的线程去处理客户端的需求。代码如下:private static void start(int port) throws IOException { Socket socket; sever = new ServerSocket(port);/...

2019-04-07 12:44:36 124

原创 socket实现简单的聊天项目

client端代码如下:public class Client { private static int SERVER_PORT = 10000; //默认服务器端口号 private static String SERVER_IP = "127.0.0.1";//服务器ip private static Scanner scan; private static ...

2019-04-02 21:17:25 393

原创 ConcurrentHashmap与HashTable

HashTable原理:Hashtable相当于线程安全的hashmap,其用synchronized保证线程安全性。在hashtable中,put和remove都是同步方法,在put时就不能进行remove操作。因此在线程竞争激烈的情况下,其效率非常低下。ConcurrentHashmap便对此进行了优化。ConcurrentHashMap原理:ConcurrentHashMap使用了锁分...

2019-04-02 10:59:12 267

原创 TCP报文段的首部格式以及三次握手四次挥手详解

TCP报文段首部格式:(1).源端口和目的端口 :各占两个字节,分别写入源端口号和目的端号。(2).序号:占4个字节。序号范围为[0-2^32-1]。序号增加到2的32次方-1时,下一个序号返回到0;传送的字节流中每一个字节按序号排列。整个要传送的字节流的起始序号必须在连接时设置。例如:一报文段的序号字段值是301,最后一个字节序号是400,显然,下一个报文段的第一个字节序号是401。(3)...

2019-03-29 11:47:53 450

原创 类的加载过程

java虚拟机一般使用Java类的流程:首先将开发者编写的java源代码(.java文件)编译成java字节码文件(.class文件),然后类加载器会读取字节码文件,并转换成java.lang.class对象。java提供的类加载器绝大对数继承于ClassLoader类,他们被用来加载不同的字节码文件。三种类加载器:(1)Boostrap ClassLoader(启动类加载器/根加载器/引导...

2018-11-27 19:06:23 84

原创 java中对象的比较与克隆

一、对象比较java中对象的比较有两种方法:1、实现comparable中的compareTo方法:例如下面这段代码:将People按照年龄排序:public int compareTo(People o) { if(this.age>o.getAge()){ return 1; }else if(this.age==o.ge...

2018-11-18 21:39:57 142

原创 java异常处理

Java异常:指在程序运行的过程中所发生的异常事件,中断指令的正常执行。异常处理:1.抓捕异常:就地解决异常,使程序继续运行例如:try{} //把会出现异常的代码放到try块中catch(Exception e){} //Exception类指一些可被抓获且可能恢复的异常情况。注意: 在try块中,如果会发生异常的语句发生了异常,则该语句后面的所有语句将不会被执行。针对这...

2018-11-12 23:19:00 72

原创 一个新对象所占的内存

1.new出一个新对象所占内存:对象头+成员变量+内存填充(1).对象头在32位系统上占用8bytes具体如下图(2)成员变量所占字节:(3)内存填充:最终与8个字节对齐。2.查看对象在堆中所占的内存的大小写一个程序: public class TestDemo{ int a=4; short a=4; try{ Thread.sleep(10...

2018-11-04 20:20:31 343

原创 String的intern()方法

由双引号定义的字符串会存储在字符串常量池中,调用intern方法,intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中,再返回当前字符串。比较下面字符串:String str1 = “a”;String str2 = “b”;String str3 = “ab”;String str4 = str1 + str2;String str5 = ...

2018-10-27 16:50:32 105

原创 Integer.valueof(int i)加包与a.intValue()拆包机制

Integer.valueof(int i)加包:调用包装类valueof()方法,即把基本类型的值转换为对应的包装类对象例:Integer a=10;//隐式加包机制,Integer.valueof(10)Integer b=Integer.valueof(10);//显示加包;a.intValue()拆包:调用intValue()方法例:Integer a=10;int b=a;/...

2018-10-16 19:43:09 410

原创 二维数组

1.定义(1).int[][] arr=new int[3][3];(2).int[][] arr=new int[][]{{1,2,3},{4,5,6},{7,8,9}};(3).int[][] arr=new int[3][];for(int i=0;i<3;i++){arr[i]=new int[3];}2.遍历方式//for 循环for(int i=0;i<a...

2018-10-15 23:15:43 76

原创 练习题:1.给一个不多于5位的正整数, 1).输出它是几位数 2).分别输出每一位数字3).按逆序输出各位数字,例如原数为321,应输出123

import java.util.Scanner;public class Demo {public static int getBit(int n){int count=0;while(n!=0){n=n/10;count++;}return count;}public static void getNum(int n){int num;System.out.printl...

2018-10-09 21:52:16 537

空空如也

空空如也

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

TA关注的人

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