- 博客(64)
- 资源 (1)
- 收藏
- 关注
原创 JVM内存结构
参考:丑胖侠二师兄: JVM之内存结构图文详解丑胖侠二师兄: 面试官,Java8 JVM内存结构变了,永久代到元空间czwbig: Java内存区域和内存模型javaGuide: 【修订完善版】面试又被 JVM 内存区域虐了?推荐你看看这篇文章!一. Java运行时数据区域JDK 1.8 之前: JDK 1.8 :
2021-08-20 11:15:26
284
原创 三方库源码学习3-LeakCanary
LeakCanary源码分析一.在哪里初始化在老版本的LeakCanary中,在集成LeakCanary时需要我们在Application中调用LeakCanary.install(this);进行初始化工作。但是在新版本中只需要我们添加依赖后,就可以直接监听Activity,Fragment等的内存泄露问题了。那么它的初始化工作是在那执行的呢?它在 AppWatcherInstaller类的 onCreate()自动完成了初始化工作。internal sealed class AppWatcher
2021-07-21 10:36:56
377
3
原创 09-其它
一. websocketWebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。全双工就是指客户端和服务端可以同时进行双向通信,强调同时、双向通信。ping(pong)。其实TCP本来就支持全双工,只是由于我们常用的HTTP必须是请求-响应模式的,所以Http就没法实现websocket这种。二. 在浏览器中输入网址后会发生什么1. DNS域名解析我们在浏览器输入网址,其实就是要向服务器请求我们想要的页面内
2021-06-20 20:32:34
220
1
原创 08-HTTPS与加密
参考博客:小林coding: 硬核!30 张图解 HTTP 常见的面试题一. HTTP 与 HTTPS 有哪些区别?https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。(但是不一定必须是这个,这个只是默认,可以自己设置)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可
2021-06-20 20:31:55
328
1
原创 07-Http的基础知识
参考博客:小林coding: 硬核!30 张图解 HTTP 常见的面试题一.Http的基本概念HTTP 是超文本传输协议。 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。二.Http的状态码1xx1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务
2021-06-20 20:25:46
441
原创 06-TCP的流量控制,拥塞控制
小林coding: 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了一.滑动窗口协议(连续ARQ协议)为什么会出现滑动窗口?在确认应答策略(停止等待协议)中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候。为解决这个问题,TCP 引入了窗口这个概念。(它实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到
2021-06-20 20:22:42
342
1
原创 05-TCP的重传机制
详解 TCP 超时与重传机制小林coding: 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了TCP的重传机制TCP 针对数据包丢失的情况,会用重传机制解决。常见的重传机制主要有:超时重传快速重传SACKD-SACK超时重传重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传。超时时间应该设置为多少呢?这里有个往返时延(RTT),就是也就是数据
2021-06-20 20:20:20
1341
原创 04-TCP三握四挥
小林coding: 近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题一. TCP 三次握手过程和状态变迁一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT 状态。
2021-06-20 20:18:14
373
1
原创 03-TCP和UDP的基本认识
参考文章:小林coding:近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题(建议收藏)TCP协议灵魂之问,巩固你的网路底层基础TCP的可靠性传输是如何保证的一. TCP 头格式序列号:建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
2021-06-20 20:13:56
552
1
原创 02-IP网络层
参考文章:小林coding : IP 基础知识“全家桶”,45 张图一套带走一. IP地址简述IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。二. IP 地址的分类最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码,即网络号和主机号。同一个物理网络上的所有主机都使用同一个网络
2021-06-16 16:47:48
323
原创 01-计算机网络的体系结构
参考文章: 小林coding:摸清网络的第一步!一.为什么要分层网络进行数据传递是一个复杂的过程,从设计模式的角度来将,实现一个复杂的,多功能的程序,为了便于维护和扩展,程序的功能之间应该是解耦的。因此,复杂的程序都要分层,这是程序设计的要求。分层的好处:各层之间是独立的。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口所提供的服务。这样,整个问题的复杂程度就下降了。灵活性好。当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下各层均不受影响。排除问题时
2021-06-16 16:41:58
350
原创 三方库源码学习2-Retrofit
文章目录一.参考博客二.Retrofit的介绍三.什么是动态代理四. Retrofit.Create()方法五. ServiceMethod六. HttpServiceMethod注解1:OkHttpCall一.参考博客三方库源码学习-1 :OkHttp一定能看懂的 Retrofit 最详细的源码解析!三方库源码笔记(7)-Retrofit 源码详解二.Retrofit的介绍官方介绍: A type-safe HTTP client for Android and Java. 这说明 Retr
2021-06-04 16:41:30
307
2
原创 三方库源码学习-1 :OkHttp
整体框架 :什么,还有这么简单的OkHttp源码分析?Dispatcher过程 :三方库源码笔记-OkHttp 源码详解OPPO互联网技术 :OkHttp源码深度解析一.OkHttp的源码框架OkHttp在请求网络的时候,是由okHttpClient执行一个 newCall 方法,将用户编写的request传入,然后就可以执行excuted或者enqueue方法进行网络请求。其中的关键就是 newCall 方法,它返回的是一个Call类型的接口,实际的实现是 RealCall ,也就是说我们发起
2021-05-31 17:31:17
241
原创 Android IPC —— AIDL的原理
文章目录1.Bindler,AIDL,Messenger的关系2. AIDL的使用1.Bindler,AIDL,Messenger的关系2. AIDL的使用
2021-05-13 19:20:07
3011
13
原创 Android IPC —— IPC 机制的简介及Bindler
文章目录1.进程的概念2.Android中为什么一个APP会需要多个进程3.为什么要进行进程间通信4.IPC原理4. Binder的简单介绍4.1 简介4.2 Binder原理简介4.2.1 Android 系统整体架构简介3.Android中的IPC方式1.进程的概念进程一般指一个执行单元,在pc和移动设备上指一个程序或者一个应用。进程中可以包含多个线程,线程是cpu调度的最小单位。2.Android中为什么一个APP会需要多个进程分散内存占用Android对于一个进程所占用的内存是有限
2021-05-12 18:53:37
1351
3
原创 Android的系统架构的认识
文章目录1.Android 系统架构1.1 Kernel 层(Linux内核层)1.2. Native层(系统运行库层)1.3. Framework (应用框架层)1.4. App(应用层)2.Android 系统启动架构2.1 Loader 层2.2 Kernel 层2.3 Native 层2.4 Framework 层Zygote进程System Server 进程Media Server 进程2.5 App层Syscall && JNI1.Android 系统架构Android底层
2021-05-12 15:19:18
1314
3
原创 Kotlin学习篇(4)—— Kotlin的类型系统
目录5. Kotlin的类型系统5.1 可空性5.1.1 可空类型5.1.1.1 : ?5.1.1.2 :安全调用运算符 ?.5.1.1.3 :Elvis运算符 ?:5.1.1.3 :安全转换 as?5.1.1.4 :非空断言 !!5.1.1.5 :“ let ”函数5.1.2 延迟初始化的属性5.1.3 可空类型的扩展5.1.4 参数类型的可空性5.1.5 可空性和java5.2 基本数据类型和其他数据类型5.2.1 基本数据类型: Int, Boolead 及 其它。5.2.2 可空的基本数
2021-04-29 15:53:13
634
1
原创 数据结构与算法——排序算法
目录一.概念1.内部排序和外部排序2.稳定排序和非稳定排序1.直接插入排序思想一.概念1.内部排序和外部排序内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。如下的排序都是内部排序。2.稳定排序和非稳定排序假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定
2021-04-23 17:10:28
363
1
原创 Kotlin学习篇(3)—— Kotlin的 类,对象,接口,object关键字
目录3.1 接口3.2 open,final和abstract修饰符:默认为final3.3 声明枚举类3.4 可见性修饰符3.5 内部类和嵌套类3.5.1 java和中内部类和嵌套类的区别3.5.2 密封类:定义受限的类继承结构3.6 类的构造函数3.6.1 constructor关键字和init3.6.2 使用val,var 简化初始化3.6.3 子类的主构造函数初始化父类3.7 默认的getter和setter及构造函数3.8 自定义访问器3.9 重写类的toString(),equals() ,ha
2021-04-20 22:10:28
1074
2
原创 Kotlin学习篇(2)—— Kotlin的函数
目录1. 定义一个函数2. 表达式函数体3. 更简洁的使用函数3.1 命名参数3.2 默认参数值4. 顶层函数5. 扩展函数6. 可变参数7. 展开运算符8. 集合相关的函数9. 键值对的处理:中缀调用和解构声明10. 字符串和正则表达式的处理1. 定义一个函数fun max(a: Int, b: Int): Int { return if (a > b) a else b}函数的声明以关键字 fun 开始,函数名称紧随其后:这个例子中函数名称是max ,接下来是括号括起来
2021-04-20 21:34:59
1666
1
原创 Kotlin学习篇(1)—— Kotlin的基础常识
目录1. Kotlin的优缺点2. 在java项目添加Kotlin支持3. if的使用4. 表达式函数体5. 变量6. 字符串模板7. when8. is的使用9. 迭代10. “in”和“!in”的使用1. Kotlin的优缺点Kotlin的优势:Kotlin更安全: Kotlin 支持显式地声明 null,并确保开发人员不会遇到可能导致质量问题的空引用异常;代码简洁:不需要分号、很多相同的功能去用Kotlin实现语法更简洁函数式支持: 高阶函数扩展函数:可以直接不需要修改
2021-04-20 20:31:22
1156
3
原创 Android线程和线程池(4)——线程池的原理
目录1.线程池的使用2.线程池的工作原理简析3.线程池是什么时候创建线程的4.工作流程5. 线程池在业务中的实践1.线程池的使用Android线程和线程池(3)——线程池的使用2.线程池的工作原理简析若程池中的线程数量未达到核心线程数,则会直接启动一个核心线程执行任务。若线程池中的线程数量已达到或者超过核心线程数量,则任务会被插入到任务列表等待核心线程空闲来执行。若任务无法插入到任务列表中,往往由于任务列表已满,此时如果线程数量未达到线程池最大线程数,则会启动一个非核心线程执行任务;线
2021-03-27 22:02:49
325
原创 Android线程和线程池(3)——线程池的使用
目录1.线程池的介绍1.1 使用线程池的原因1.2 使用线程池的好处2.线程池的使用说明2.1 构造方法2.2 参数解释2.3 线程池状态3.使用线程池3.1 使用的流程3.2 线程初始化3.3 线程池关闭3.4 线程池容量调整3.5 具体的demo4.功能线程池4.1 定长线程池(FixedThreadPool)4.2 定时线程池(ScheduledThreadPool )4.3 可缓存线程池(CachedThreadPool)4.4 单线程化线程池(SingleThreadExecutor)4.5
2021-03-27 21:59:37
429
原创 Android线程和线程池(2)——IntentService
文章目录一.IntentService的介绍二.IntentService的使用姿势三.源码分析四.面试题归纳一.IntentService的介绍很多时候我们创建Service就是希望Service能在后台进行一些耗时操作,但是又由于Service默认是运行在主线程的,我们不太方便直接进行耗时操作,然后每次进行耗时操作我们都得手动创建新的线程,显得很麻烦。所以就会有IntentService,它内部是帮我们创建了一个HandleThread,以及对应的Handler,并通过onStart方法把inte
2021-03-23 18:39:46
225
原创 Android线程和线程池(1)——线程的介绍和HandlerThread
文章目录1.Android线程的基本介绍2.AsyncTask3.HandlerThread工作原理使用步骤1.Android线程的基本介绍线程在Android中是一个很重要的概念,从用途上说,线程分为主线程和子线程。主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作。 除了Thread本身除外,在Android中可以扮演线程角色的的还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。尽管他们的表现形式有别于传统的线程
2021-03-23 18:39:12
470
原创 Android的消息机制
文章目录一.消息机制的概述1.模型2.流程概述3.典型实例二.Android的消息机制分析1.ThreadLocal一.消息机制的概述Android的消息机制主要指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。主要用于UI线程和子线程之间的交互。 一般情况下,出于安全的考虑,所有与UI控件的操作都要放在主线程及UI线程,而一些耗时操作应当放在子线程中。当在子线程中完成耗时操作并要对UI控件进行操作时,就要用Handler来控制了。&n
2021-03-17 21:52:47
196
原创 Android 动画深入分析(三)——属性动画的高级使用及工作原理
文章目录一.前言二. 对任意属性做动画用一个类来包装原始对象,间接提供get和set方法采用ValueAnimator,监听动画过程,自己实现属性的改变三.TypeEvaluator(估值器)和一.前言前面已经介绍过了逐帧动画,补间动画,和一些属性动画的简单使用,接下来介绍一下属性动画的高级使用及工作原理。 属性动画可以对任意对象进行动画操作,接下来我们就使用任意对象来实现动画。二. 对任意属性做动画给Button加一个动画,让button的宽度从当前值增加到500px,即对butto
2021-03-13 11:03:32
322
原创 Android 动画深入分析(二)——属性动画的简单使用
文章目录一.前言二.补间动画的缺陷三.属性动画的优势四.三种常见的属性动画类1.ValueAnimator2.ObjectAnimator3.AnimatorSet五.Animator监听器六.使用XML编写动画一.前言自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。关于 逐帧动画,补间动画可以参看这篇博客Android 动画深入分析(一)——逐帧动
2021-03-13 11:01:02
254
原创 Android 动画深入分析(一)——逐帧动画,补间动画
文章目录一.前言二.逐帧动画三.补间动画补间动画的介绍补间动画的使用一.前言Android的动画大致分为三种 ,分别是 逐帧动画 ,补间动画 ,属性动画二.逐帧动画逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。 步骤:在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片;使用AnimationDrawable类播放第一步定义好的D
2021-03-13 10:59:12
580
原创 Android View(五)——自定义View
文章目录一.前言二.自定义View的分类1.继承View重写onDraw方法2.继承ViewGroup派生出特殊的Layout3.继承特定的View(比如TextView)4.继承特定的ViewGroup(比如LinearLayout)三.自定义View须知四.自定义View示例1.继承View重写onDraw方法1.1自定义属性1.2完整代码2.继承ViewGroup派生特殊的Layout一.前言自定义View的实现需要我们对View的层次结构,事件分发机制和View的工作原理等知识有较好的掌握,具体
2021-03-10 21:34:34
2434
2
原创 Android View(四)——View的工作原理
文章目录一.初识ViewRoot 和 DecorView二.View的工作流程概述View绘制过程中的一些方法介绍三.理解MeasureSpec1.MeasureSpec是干什么的?2.MeasureSpec的定义3.MeasureSpec和LayoutParams的对应关系3.1 顶级View(DecorView)一.初识ViewRoot 和 DecorViewDecorViewDecorView是整个Window界面的最顶层View。DecorView只有一个子元素为LinearLayout。代
2021-03-09 21:58:23
406
原创 Android View(三)——View的滑动冲突
文章目录一.滑动冲突的原因二.常见的冲突场景:三.滑动冲突的处理规则1.场景1的处理规则2.场景2的处理规则3.场景3的处理规则四.滑动冲突的解决方法1.外部拦截法1.1模板代码:1.2 实例代码:2.内部拦截法2.1模板代码:2.2实例代码:五.完整实例一.滑动冲突的原因在界面中当有内外两层View同时可以滑动的时候,这个时候就会产生滑动冲突。二.常见的冲突场景:场景1场景2场景3三.滑动冲突的处理规则1.场景1的处理规则对于场景1的处理规则是,当用户左右滑动时,需
2021-03-08 11:27:40
348
原创 Android View(二)——View的事件分发机制
文章目录一.Activity的层级结构二.事件分发的基础认识1.事件分发是什么2.事件分发过程中的三个重要方法二.事件分发的过程了解1.图解:1.1基本过程图解1.2 关于ACTION_MOVE 和 ACTION_UP2. demo验证上述过程三.onTouch、onClick、onLongClick的调用顺序四.事件分发源码分析1.Activity的事件分发2.ViewGroup的事件分发机制3.View的事件分发机制五.事件分发的总结六.参考资料一.Activity的层级结构在了解View的事件分发
2021-03-06 21:46:04
1910
7
原创 Android View(一)——View的基础知识
目录一.View的基础知识1.什么是View2.View的位置参数3.MotionEvent4. TouchSlop5. VelocityTracker6. GestureDetector一.View的基础知识1.什么是ViewView是一种界面层的控件的一种抽象,它代表了一个控件,是Android中所有控件的基类。2.View的位置参数3.MotionEvent在我们触摸屏幕的过程中,可以分为三种情况,分别是按下、滑动、弹起。Android中为我们封装好了一个MotionEvent类,使
2021-03-04 15:30:47
6624
1
原创 HashMap源码分析
目录简介继承关系简介 HashMap是基于哈希表的Map接口实现,是以key-value储形式存在,即主要用来存放键值对。HashMap的实现是不同步的,这意味着它不是线程安全的。它允许使用null作为key、value。此外,HashMap中的映射不是有序的。 继承关系public class HashMap&
2021-02-02 17:16:03
185
2
原创 Android动态添加View方法总结
问题 在写学生签到页面时需要根据签到的状态和方式不同展示不同的页面,如果把他们都写在一个页面那么页面的布局就会很臃肿,这时想到了可不可以进行动态添加View,在查阅了一些博客之后学习了一些添加方法,在这里做个总结。对比图 ...
2020-12-30 17:40:02
3397
1
原创 更好看的标题栏(1)
有时为了给用户更好的体验,我们需要更改标题栏的颜色和图标颜色,比如改为白底黑字,或者沉浸式状态栏等。需求1:更改标题栏的颜色和图标颜色:效果如下: 1. 在themes中统一设置在style中添加<!-- 修改标题栏为白色 ,注意后面版本号设置--><item name="android:statusBarColor" t
2020-12-10 20:52:37
516
原创 Android框架——组件化的搭建
文章目录1.什么是组件化?1.1 为什么要用组件化1.2 组件化的介绍1.3 组件化的优点1.4 组件化的框架2.组件化框架的搭建2.1 Gradle中版本号的统一管理2.2 基础层的搭建2.3功能层的搭建写在前面-包名和资源文件名命名冲突问题1.什么是组件化?1.1 为什么要用组件化 在项目的开发过程中,随着开发人员的增多及功能的增加,如果提前没有使用合理的开发架构,那么代码会越来臃肿,功能间代码耦合也会越
2020-11-23 00:44:29
1011
3
原创 Android网络请求——OKHttp封装+GSON封装
封装好的OkHttp,GSON方便平时使用public class OkHttpUtil { public static void GETOkHttpRequest(String address,okhttp3.Callback callback){ OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(addres
2020-11-08 22:22:10
599
android聊天室客户端+java服务端
2020-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人