自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Allence的博客

干吧嘚

  • 博客(170)
  • 收藏
  • 关注

原创 获取RecyclerView滑动的距离

如代码所述,totalDy的确保存了 RecyclerView 的滑动距离,但是当我向下滑动 RecyclerView ,之后插入/删除/移动 Item 的时候,totalDy 就变得不精确了;这是因为recyclerViewl.getChildAt(0) 返回的永远是第一个可见的child,不是所有view list 的第一个child,因此这种用法是得不到滑动距离的。依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的 totalDy 在滑动到一定程度后清零。

2023-01-11 11:19:21 1128

原创 Fragment通过FragmentManager通信

(2).如果在 FragmentA 中接受 FragmentB 发送的数据,FragmentA 是 FragmentB 的父容器,那对于FragemntA来说它和FragemntB的共同的FragmentManager是A的childFragmentManager,对于FragmentB来说它和A的共同的FragmentManager是B的parentFragmentManager,所以A接收B的消息用childFragmentManager,B发送A的消息用parentFragmentManager。

2022-12-31 10:54:43 1246

原创 Retrofit源码分析

Retrofit的中文翻译是改造,改造什么呢?我认为是对OkHttp的使用、RxJava的使用进行改造。具体体现在哪里?在使用OkHttp请求前:1.用注解统一配置网络请求头和请求参数2.通过动态代理统一获取注解的请求头和请求参数然后一致组装适配成请求的request,交给okHttp进行请求使用OkHttp结果返回后:1.线程切换线程切换分为两种一种是用Retrofit默认的,另一种是使用RxJava2.把返回的数据json适配成javabean。

2022-10-28 15:58:14 1587

原创 OkHttp源码分析

一个请求的配置类,采用了建造者模式,方便用户配置一些请求参数,如配置,cookie,等等。//调度器//连接池//整体流程拦截器//网络流程拦截器//流程监听器//连接失败时是否重连//服务器认证设置//是否重定向//是否从HTTP重定向到HTTPS//cookie设置//缓存设置= null//DNS设置//代理设置= null//代理选择器设置= null//代理服务器认证设置//socket配置//https socket配置= null= null。

2022-10-25 17:27:33 733

原创 计算机网络编程

我们主要关注TCP/IP四层模型,OSI七层模型了解即可TCP/IP并不是简单指TCP协议和IP协议,而是全称Transmission Control Protocol/Internet Protocol,中文名是:传输控制协议/因特网互联协议,是指利用IP进行通信时所必须用到的协议群的统称。

2022-10-13 09:19:38 965

原创 RXJava源码分析

流程分析:对于被观察者来说,装饰器模式体现在subscribeActual方法对于观察者来说,装饰器模式体现在onNext方法。

2022-09-18 13:31:57 912

原创 RecyclerView缓存复用详细解析

Scrap是RecyclerView中最轻量的缓存,它不参与滑动时的回收复用,只是作为重新布局时的一种临时缓存,缓存(保存)动作只发生在重新布局时,布局完成后就要清空缓存。它的目的是,缓存当界面重新布局(不包括初始化第一次)的前后都出现在屏幕上的ViewHolder,这样就省去了不必要的CreateView和bindView的工作。.........

2022-08-30 18:51:35 1257

原创 事件处理机制原理分析

这里的cb就是Activity,所以cb.dispatchTouchEvent(ev)就是调用Activity的dispatchTouchEvent(ev)方法,所以事件的传递是先到DecorView的dispatchTouchEvent再到Activity的dispatchTouchEvent。

2022-08-16 19:36:51 305

原创 View绘制流程

是在onResume之后。

2022-08-11 23:54:54 506

原创 setContentView详解

setContentView我们在Activity中经常见到,它的作用就是把我们的布局文件放在Activity中显示,下面我们根据源码分析setContentView是如何做到的。

2022-07-20 19:36:59 9480

原创 HashTable源码解析、Collections.synchronizedMap解析

HashTable的操作几乎和HashMap一致,主要的区别在于HashTable为了实现多线程安全,在几乎所有的方法上都加上了synchronized锁,而加锁的结果就是HashTable操作的效率十分低下。不建议使用HashTable,Oracle官方也将其废弃,建议在多线程环境下使用ConcurrentHashMap类。HashMap是线程不安全的类,多线程下会造成并发冲突,但单线程下运行效率较高;HashTable是线程安全的类,很多方法都是用synchronized修饰,但同时因为加锁导致并发效率

2022-06-20 17:07:35 235

原创 LinkedHashMap源码解析

从继承关系上,我们看到LinkedHashMap继承了HashMap,它里面的增删改差遍历的逻辑都是使用的HashMap中的,但是LinkedHashMap比HashMap多了一个双向链,这个双向链是从第一个插入的元素开始按照插入顺序,连接起来,所以可以说LinkedHashMap是可以保证插入顺序的。看图:这里就简单的给大家看一下这个链是啥样的,不画红黑树了1).是在创建新节点的时候,把双向链连接起来,注意有两种节点一个是TreeNode一个普通Node源码:代码太简单了,这里简单描述一下,就是添加

2022-06-17 18:51:16 506

原创 Android虚拟机和类加载机制

一、Android虚拟机1.虚拟机的作用虚拟机的作用就是给我们的代码提供运行时环境。什么是运行时?简单来说,运行时就是一个供操作系统使用的系统,它负责将你用高级语言(比如 Java)编写的代码转换成 CPU/处理器能够理解的机器码。运行时由你的程序运行时所执行的指令构成,尽管本质上它们不属于程序代码的任何一部分。CPU (或者更通用的说法电脑)只能够理解机器语言(二进制代码),所以为了使程序能够在 CPU 上运行,就必须将它们翻译成机器码,这一工作由翻译器完成。2.dalvik虚拟

2022-04-27 00:22:36 691

原创 设计模式学习与实践

一、什么才是优秀的代码架构1.代码复用2.拓展性二、如何正确的使用设计模式1.需求驱动2.分析成功的模式应用项目3.充分了解所使用的开发平台4.在编程中领悟5.避免过度设计三、七大软件设计原则1.开闭原则对扩展开放,对修改关闭,降低维护带来的新风险(1).开闭原则的作用开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。具体来说,其作用如下:1).对软件测试的影响软件遵守开闭原则的话,软件测试时只需要

2022-04-26 19:27:11 245

原创 动态规划算法

一、动态规划算法思想动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,

2022-04-08 19:28:15 20753

原创 十大排序算法

冒泡法排序、选择排序、直接插入法排序、快速排序、单路、双路、三路快排、希尔排序、归并排序、堆排序、桶排序、基数排序、计数排序 十大排序

2022-03-01 14:45:33 423

原创 HashMap源码解析

一、HashMap用到的数据结构哈希表、数组、链表、红黑树数组、链表这里不再讲了1.哈希表(1).哈希表定义:哈希表又叫散列表,是一种根据设定的映射函数f(key)将一组关键字映射到一个有限且连续的地址区间上,并以关键字在地址区间中的“像”作为元素在表中的存储位置的一种数据结构。这个映射过程称为哈希造表或者散列,这个映射函数f(key)即为哈希函数也叫散列函数,通过哈希函数得到的存储位置称为哈希地址或散列地址(2).哈希冲突定义:对于不同的关键字,可能得到同一个哈希地址,即key

2022-02-28 19:24:31 548

原创 红黑树详解,对插入旋转独到理解

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。详细描述如下:第一步: 将红黑树当作一颗二叉查找树,将节点插入。 红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉...

2022-02-16 17:03:02 1887

原创 Android 11设置Intent.ACTION_VIEW的URI使用queryIntentActivities查询

Android 11最小权限原则有一项规定,使用queryIntentActivities查询,只能查询到一些自动对您的应用可见的应用如:浏览器、apk安装等,其他应用查不到了。如果想查到那些不可见的应用有两种方式:一、在Manifest中添加QUERY_ALL_PACKAGES权限添加了这个QUERY_ALL_PACKAGES权限后可以查到所有应用了,但是如果想上架Google的应用商店是不行的,Google会检测这个然后把你的应用拒掉,国内不知道有没有问题二、在Manifest中添加&l

2022-02-14 14:29:35 3471

原创 AVL树详解

一、简介AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的。它是最先发明的自平衡二叉查找树,也被称为高度平衡树。上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状..

2022-02-14 10:01:48 10982

原创 二叉树详解

1.这里就不介绍二叉树的相关概念,如,树高度,节点层数,节点度数,路径,叶节点,分支节点,根节点,父节点,左节点,右节点,兄弟节点,祖先节点,子孙节点,左子树,右子树等基本概念2.二叉树的分类(1).斜树斜树:所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。左斜树:右斜树:(2).满二叉树国际标准定义是除了叶结点外每一个结点都有左右子结点的二叉树。如下图所示:注意:这里的定义与国内某些教材的定义不同,国内的定义是:

2022-02-10 19:27:45 1295

原创 Java接口回调的本质

本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用virtual dispatch 机制会首先从 receiver(被调用方法的对象的实际类型)的类的实现中查找对应的方法,如果没找到,则去父类查找,直到找到函数并实现调用,而不是依赖于引用的类型。如果不清楚JVM的可以看我这篇文章:对Java字节码文件到JVM运行的一个认识_Allence的博客-CSDN博客推荐书籍:java虚拟机规范 这本书告诉我们: JVM是一种规范深入理解ja

2022-02-10 11:54:45 516

原创 Vector和Stack详解

Vector底层实现、数据结构和ArrayList一样都是对数组的操作,只不过Vector的方法经过synchronized修饰是同步的所以Vector是线程安全的,还有扩容的时候如果不指定扩容大小会默认扩容为原来的2倍,ArrayList是1.5倍。Stack是继承Vector,所以底层数据结构也是数组,只不过Stack它是按照栈的逻辑结构实现的,比如push方法在末尾压入一个元素和pop方法就是弹出最后一个元素,search方法也是从后往前查找,这些都是因为栈的特性是后入先出,有一点要注意Sta..

2022-01-27 17:29:22 1851

原创 LinkedList详解

java集合总结:ArrayList详解_Allence的博客-CSDN博客一、介绍ArrayList是以什么数据结构实现的ArrayList底层的数据结构是顺序表。顺序表:物理内存上连续、逻辑上连续、大小可以动态扩展顺序表是由数组实现的,说道这里就理一下数组、链表、顺序表之间的关系。逻辑结构:结构定义中是对操作对像的数学描述,描述的是数据元素之间的逻辑关系。例如,线性结构,树形结构,图状结构或网状结构。它们都属于逻辑结构。物理结构:又称存储结构,是数据结构在计算机中的表示(又称映像)。例如,数组,指针

2022-01-21 19:28:45 1179

原创 ArrayList详解

一、介绍ArrayList是以什么数据结构实现的ArrayList底层的数据结构是顺序表。顺序表:物理内存上连续、逻辑上连续、大小可以动态扩展顺序表是由数组实现的,说道这里就理一下数组、链表、顺序表之间的关系。逻辑结构:结构定义中是对操作对像的数学描述,描述的是数据元素之间的逻辑关系。例如,线性结构,树形结构,图状结构或网状结构。它们都属于逻辑结构。物理结构:又称存储结构,是数据结构在计算机中的表示(又称映像)。例如,数组,指针。线性表:属于逻辑结构中的线性结构,它包括顺序表和链表。

2022-01-16 23:50:38 5067

原创 Java集合概览、实现细节、数据结构

1.ArrayList2.LinkedList3.Stack 和 Vector4.hashMap、LinkedHashMap

2022-01-14 15:29:33 161

原创 JVM 类加载器

一、类加载器虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字 节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类加载器可以说是Java语言的一项创新,也是Java语言流行的重要原因之一,它最初是为了满足Java Applet的需求而开发出来的。虽然目前Java Applet技术基本上已经“死掉”,但类加载器却在类层次划分、OSGi、热部署、代码加密等领域大放异彩,成为了Java技术体系中一块重要的

2022-01-08 16:19:47 236

原创 对Java字节码文件到JVM运行的一个认识

推荐书籍:java虚拟机规范 这本书告诉我们: JVM是一种规范深入理解java虚拟机先有个整体的概念:java程序运行的本质就是方法套方法,我们需要知道的就是我们编写的java文件编译后的字节码被JVM如何保存(即如何把一个类的各种信息存下来),在方法执行的时候如何能找到之前存的信息,还有在执行过程中发生了什么(内存中如何变化)一、JVM如何保存字节码文件1. Java代码编译成的字节码文件:先看一个类:public class TestA { public sta.

2022-01-07 19:27:06 1267

原创 APT技术原理和简单实现

原理: 编写好的 Java 源文件,需要经过 javac 的编译,翻译为虚拟机能够加载解析的字节码 Class 文件。注解处理器是 javac 自带的一个工具,用来在编译时期扫描处理注解信息。你可以为某些注解注册自己的注解处理器。 注册的注解处理器由 javac调起,并将注解信息传递给注解处理器进行处理。简单实现:我们可以给我们的自定义注解写一个处理器来在编译的时候,处理一些逻辑,上面说到了原理就是在编译的时候如果我们注册了自己的注解处理器,javac就会帮我们调起,这样就能执行我们的逻辑了.

2021-12-03 11:37:56 4143

原创 用注解、反射、动态代理实现ButterKnife功能

ButterKnife的实现需要先熟悉注解、反射、动态代理,不熟悉的小伙伴可以去看这三篇文章:Java注解Java反射动态代理下面我们就来看一下ButterKnife的实现:ButterKnife相信大家都会用,它能通过注解帮我们绑定布局文件中的控件,能通过注解帮我们设置view的click事件今天我们除了实现这两个功能还要实现通过注解代替setContentView(R.layout.xxx)功能1.通过注解实现setContentView功能思路:定义一个MyConten

2021-12-02 17:15:13 2291

原创 Java 注解

注解的本质就是给载体打一个Tag,我们查找到这个tag后就可以对我们打Tag的载体进行一些特殊处理Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 注解是元数据的一种形式,提供有关 于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。 注解声明 声明一个注解类型Java中所有的注解,默认实现 Annotation 接口:package java.lang.annotation;public interface

2021-12-02 16:42:45 2698

原创 Type 反射获取泛型真实类型

Generic 中文翻译--> 泛型当我们对一个泛型类进行反射时,需要的到泛型中的真实数据类型,来完成如json反序列化的操作。此时需要通 过 Type 体系来完成。 Type 接口包含了一个实现类(Class)和四个实现接口,他们分别是:实现类:TypeVariable 泛型类型变量。可以泛型上下限等信息; ParameterizedType 具体的泛型类型,可以获得元数据中泛型签名类型(泛型真实类型) GenericArrayTy...

2021-11-30 16:26:52 1360

原创 Java静态代理和动态代理

Java动态代理原理:1.这个动态代理对象是什么,为什么能强转成那些传入的Proxy.newProxyInstance中的第二个参数的接口2.怎么实现的一调用我们传入Proxy.newProxyInstance中的第二个参数中接口中的方法,就会触发InvocationHandler的invoke方法,并且把调用的那个方法的Method和参数传过来。

2021-11-26 19:36:38 183

原创 源码解析横竖屏切换时ViewModel的mViewModelStore的存储即onRetainNonConfigurationInstance()调用逻辑

横竖屏切换的时候会调用ActivityThread中的handleRelaunchActivity()看名字就知道是要重新启动Activity,handleRelaunchActivity()有个handleRelaunchActivityInner(),从handleRelaunchActivityInner()这个方法开始进入正题:

2021-11-23 16:37:09 2409

原创 ViewModel原理,源码分析,通俗易懂

先看使用方法:public class MyActivity extends AppCompatActivity { private MyViewModel vm; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyActivityBinding binding = MyA

2021-11-22 11:20:07 2098

原创 LiveData去除粘性

通过上篇:LiveData的源码分析我们知道LiveData的最后一次数据会产生粘性根本原因就是ObserverWrapper.mLastVersion>= mVersion 没有拦住所以只要我们想办法在观察者注册的时候(执行observe方法)修改mLastVersion的值让他等于LiveData中维护的mVersion这样这个判断就能拦住,数据也就没有粘性了如何修改ObserverWrapper实现类LifecycleBoundObserver中的mLastVersion呢?..

2021-11-19 18:35:09 750

原创 LiveData原理,源码分析,通俗易懂

本篇文章用到了Lifecycle,如果没有了解过Lifecycle原理的同学请点传送门:Lifecycle原理,源码分析_Allence的博客-CSDN博客大家在看这篇文章的时候最好自己也点开源码跟着一步一步看一看,这样印象深刻 MutableLiveData<String> liveData = new MutableLiveData<>(); liveData.observe(this, new Observer<String&g

2021-11-16 19:34:26 594

原创 Lifecycle原理,源码分析,通俗易懂

先看一句Lifecycle最常用的代码: getLifecycle().addObserver(new LifecycleEventObserver() { @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { } });被观察者Activity或者Fr

2021-11-12 18:06:15 5648 2

原创 Java反射

一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接 对这个类进行实例化,之后使用这个类对象进行操作。 反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们 使用 JDK 提供的反射 API 进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性(包括私有方法和属性)。是Java被视为动态语言的关键。 Ja.

2021-11-05 19:28:42 119

原创 java JVM 内存结构

一、java虚拟机内存:线程共享:堆、方法区线程独享:虚拟机栈、本地方法栈、程序计数器二、堆:是垃圾回收的主要区域堆的内存又根据垃圾回收分为:1.新生代:Eden、S0(Survive from)、S1(Survice to)2.老年代三、方法区:包括运行时常量池、字符串常量池、类元信息、静态变量需要注意的一点是方法区是规范,在不同类型的虚拟机中采用不同的实现方法,hotspot在jdk 1.7包括1.7之前方法是永久代实现的(目的是为了不用在给方法区写垃圾回收的代码),永久

2021-05-25 14:36:43 195

空空如也

空空如也

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

TA关注的人

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