自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 华为OD机试 - 文件缓存系统——优先队列解法

华为OD机试 - 文件缓存系统——优先队列解法

2024-07-22 17:08:08 292

原创 华为od机试——解密犯罪时间

华为od机试——解密犯罪时间

2024-07-17 12:15:54 265

原创 Android内存泄漏及OOM问题小结

文章目录内存泄漏概述静态变量导致的内存泄漏单例模式导致的内存泄漏匿名内部类或非静态内部类导致的内存泄漏1.匿名内部类2.非静态内部类资源对象使用后未关闭OOM问题导致OOM的原因避免OOM的一些方法参考资料内存泄漏概述在java中,内存泄漏是指某个对象在回收时,因为其他对象持有它的引用而造成这个对象无法被回收的问题。GC判断一个对象是否是可以被回收是通过引用计数法或可达性分析算法,而后者在java中更为常用。可达性分析算法简单来说就是判断这个对象是否被GC Root直接或间接引用,如果这个对象没有任

2020-09-11 19:04:17 252

原创 Retrofit源码分析(2.9.0最新版)

Retrofit源码分析文章目录Retrofit源码分析前言概述简单使用源码分析1.Retrofit的创建2.Call对象的创建2.1 默认情况2.2 kotlin挂起函数只需要响应体的情况2.3 kotlin挂起函数返回值想要完整的Response的情况参考资料前言本文基于retrofit 2.9.0,在2.6.0版本之后,retrofit对kotlin协程进行了支持,主要是加入了一些kotlin的扩展函数。概述Retrofit并不是一个网络请求库,它的作用主要是为了简化网络请求的构建和对返回数

2020-08-25 18:00:40 973

原创 OkHttp——复用连接池源码小结(4.7.2 kotlin源码)

OkHttp复用连接池文章目录OkHttp复用连接池前言源码分析获取connection缓存缓存connection自动清理连接通知连接变得空闲清理所有的空闲连接小结参考资料前言本文基于OkHttp 4.7.2,如有谬误,请各位大佬指正。源码分析为了解决TCP三握四挥而造成的效率问题,在发送完HTTP请求并收到响应后保持TCP连接不断开,这就是HTTP的keepalive connections机制(HTTP1.1以后默认开启)。OkHttp的复用连接池就是为了复用这些没有断开连接的TCP连接的。

2020-08-13 23:16:48 370

原创 OkHttp网络请求流程小结

OkHttp网络请求流程小结文章目录OkHttp网络请求流程小结前言简单使用源码分析创建Call对象并加入线程池处理通过拦截器发送请求缓存策略HTTP的缓存OkHttp的缓存策略失败重连请求流程图参考资料前言本文基于OkHttp 4.7.2,下面的源码都是kotlin,我看了看OkHttp的github,发现最新4.8.0版本kotlin和java五五开,所以还不会kotlin的Android程序猿还不赶快学起来~简单使用OkHttpClient client = new OkHttpClient

2020-08-06 22:09:21 462

原创 HTTP协议的缓存

HTTP协议的缓存HTTP的缓存主要是通过请求和相应报文头部的几个字段来控制缓存的。Cache-Control:通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制Etag:HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖。Cache-Control指令也就是Cache-Control后面的字段max-age设置缓存存储

2020-08-06 09:53:14 334

原创 计算机网络——TCP协议相关知识总结

TCP协议相关知识总结文章目录TCP协议相关知识总结前言概述特点TCP头部TCP建立连接的过程断开连接的过程TCP可靠传输1.数据校验2.数据合理分片和排序3.确认和重传滑动窗口协议原理概述ARQ协议4.TCP流量控制5.TCP拥塞控制慢开始拥塞避免快重传快恢复TCP和UDP的区别参考资料前言TCP这块内容还真是挺多的,计科专业暂时没有学过计网,提前学学这块内容还是比较吃力的。如有谬误,请各位大佬指正。概述TCP即Transmission Control Protocol,译为传输控制协议。它是

2020-08-01 10:39:53 661

原创 计算机网络——HTTPS相关知识小结

HTTPS相关知识小结HTTP的缺点主要有下面几点:通信使用不加密的明文报文,内容可能会被窃听不验证通信方身份,有可能遭遇伪装无法证明报文的完整性,所以报文有可能会被篡改为了解决以上一系列问题,需要在HTTP的基础上加入加密处理和认证等机制,这就出现了HTTPS。HTTP协议可以和SSL(Secure Socket Layer,安全套结层)或TLS(Transport Layer Security,安全层传输协议)组合使用,来加密HTTP的通信内容。其中与SSL组合使用的HTTP被称为HT

2020-07-27 19:19:08 159

原创 HTTP断点续传知识小结

文章目录HTTP断点续传小结断点续传如何实现断点续传RangeContent-Range第三方库进行范围请求资源发生改变的问题参考资料HTTP断点续传小结断点续传断点续传指的是从文件上次中断的地方开始传送数据,而并非是从文件开头传送,这样可以节省时间,提高速度。也可以将文件划分为几个部分,每一个部分采用一个线程进行上传/下载,这就是多线程下载。如何实现断点续传HTTP 1.1中请求头中增加了Range参数,可以实现范围请求,这是实现断点续传的基础。服务器端通过带有Content-Range参数的响

2020-07-24 22:33:39 225

原创 HTTP协议相关知识点小结

HTTP协议相关知识点小结前言有些图片直接从网上拿来的,如有侵权,请联系我删除。概述HTTP协议,即HyperText Transfer Protocol,译作超文本传输协议,“超文本”,即包括文本、声音和图像等任何可以从互联网上得到的信息。它是基于TCP/IP协议的应用层协议。作用定义了客户端(请求资源的一端)和服务器(提供资源响应的一端)之间的通信规则。特点无状态:不保存之前发送过的请求或响应和状态信息无连接:浏览器每次请求都需要建立TCP连接传输可靠性高因为它采用TC

2020-07-23 18:30:58 378

原创 计算机网络知识总结——网络分层

计算机网络知识总结——网络分层前言计网相关的文章主要结合《计算机网络-谢仁希》、《图解HTTP》、《图解TCP/IP》等书籍和大佬Carson_Ho等的计网相关文章来学习计网的重点知识,包括网络分层,Http、Https、和TCP等协议。协议基本概念我们应该都听过http、ip、tcp等协议,那么什么是协议呢?协议其实就是一种规范或者说标准。在计算机网络的发展过程中出现的这些协议,是为了不同厂商的计算机或设备之间进行通信,只要遵循了相同的协议它们之间就可以实现通信。计算机网络的体系结构主要

2020-07-23 09:34:13 671

原创 EventBus源码分析小结

EventBus概述EventBus是一款针对Android优化的发布-订阅事件总线。它简化了应用程序内各组件间、组件与后台线程间的通信。其优点是开销小,代码更优雅,以及将发送者和接收者解耦。其中体现的设计模式有订阅者模式、建造者模式、单例模式等等。简单使用场景:MainActivity中有一个HomeFragment,在MainActivity启动时通过EventBus向HomeFragment发送初始化事件。定义事件class InitEvent(var activityClass: C

2020-07-16 00:15:17 157

原创 RecyclerView缓存机制小结

文章目录RecyclerView缓存机制小结前言概述缓存分析Recyclerlayout过程获取缓存过程进行缓存参考资料RecyclerView缓存机制小结前言本文主要通过学习参考资料中的两个大佬的两篇文章来总结RecyclerView缓存机制,如有谬误,还请各位大佬指正。概述RecyclerView对ListView有了一些优化,多了几种缓存,因此性能上有所提升,当然逻辑也更加复杂,但是再复杂它也就是一个 ”自定义“ View而已。缓存分析RecyclerRecyclerView的缓存主要

2020-07-14 19:16:01 430

原创 ListView缓存机制小结

文章目录ListView缓存机制小结前言概述layout过程第一次Layout第二次Layout滑动事件参考资料ListView缓存机制小结前言由于本人水平有限,如果文章中出现一些谬误,还请各位大佬指正。概述ListView的缓存通过父类AbsListView中的内部类RecycleBin实现,这个类中有两级缓存:ActiveViews 和ScrapViewsActiveViews用来缓存滑动后还留在屏幕内的itemview,供layout过程使用ScrapViews用来缓存滑出ListVi

2020-07-13 22:19:54 526

原创 Android屏幕刷新——源码分析

Android屏幕刷新原理——源码分析文章目录Android屏幕刷新原理——源码分析概述VSync信号三级缓冲源码分析消息队列的同步屏障参考资料概述Android系统每16ms(一般的安卓手机的FPS(每秒的帧数)是60)会请求一次VSync(垂直同步)信号,进行一次屏幕刷新。在请求到VSync信号后系统会向主线程发送一个异步消息,为了保证UI的流畅,系统使用了消息队列的同步屏障来优先处理这个屏幕重绘的异步消息。VSync信号VSync是Vertical Synchronization的缩写,译作

2020-07-11 17:45:18 2035

原创 自定义LoadingView——kotlin实现

前言自己动手实现了一个自定义加载视图,感觉效果还可以,这里分享一波,供大家学习和交流。如果有写得不好的地方,还请各位大佬指正。效果图废话不多说,先上效果图:分析这个自定义LoadingView由三个大小不断变化的小球构成,三个小球大小的不同步变化由ValueAnimation的startDelay方法实现。其中变化的最大半径、最小半径、小球间距、颜色等属性都可以进行自定义;在onMeasure方法中需要对高度为wrap_content时进行处理;在onDetachedFromWindow

2020-07-07 00:30:30 735

原创 LinkedList源码分析总结

文章目录LinkedList源码分析总结前言概述源码分析1.成员变量2.构造方法3.增4.删5.改6.查LinkedList源码分析总结前言本文基于JDK8,如有谬误请各位大佬指正。概述LinkedList是一个有序集合,底层结构是一个双向链表,它允许元素为null增删节点只需要修改节点指针,效率很高;而查改都需要遍历链表,效率较低线程不安全。使用迭代器遍历时如果进行add,remove等增删元素的操作,就会抛出ConcurrentModificationException。如须

2020-06-18 18:18:01 280

原创 ArrayList源码分析总结

文章目录ArrayList源码分析总结前言概述源码分析1.成员变量2.构造方法3.增4.删5.改6.查7.迭代器ArrayList源码分析总结前言本文基于JDK8分析总结,如有谬误还请各位大佬指正。概述ArrayList即可变长数组,它底层结构为数组,内存空间连续,随机访问效率很高。扩容通过Arrays.copyOf方法实现,这个方法通过System.arraycopy这个native方法实现数组扩容。一般情况下,每次扩容至原数组的1.5倍大小。它允许元素为null,存储元素时按顺序在数组中

2020-06-17 21:38:58 271

原创 设计模式——行为型设计模式

文章目录行为型设计模式策略模式模板方法模式观察者模式参考资料行为型设计模式行为型模式主要处理类或对象如何交互及如何分配职责。策略模式策略模式主要用来解决多个 if…else 语句带来的代码变得臃肿问题。多个if…else语句造成维护成本加大,这显然违背了开放封闭原则。定义:定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而独立变化。在策略模式中有如下角色。Context:上下文角色,用来操作策略的上下文环境,起到承上启下的作用,屏蔽高层模块

2020-06-15 17:28:27 349

原创 设计模式——结构型设计模式

文章目录结构型设计模式代理模式装饰模式外观模式享元模式参考资料结构型设计模式结构型设计模式从程序的结构上解决模块间的耦合,它包括适配器模式、代理模式、装饰模式、外观模式、桥接模式、组合模式和享元模式。代理模式也称为委托模式。安卓进程间通信机制中就使用了这种模式。定义:为其他对象提供一种代理以控制对这个对象的访问。下面请出主要角色:Subject:抽象主题类声明真实主题与代理的共同接口方法RealSubject:真实主题类,代理类代表的真实主题。客户端通过代理类间接调用真实主题类的方法P

2020-06-15 17:21:55 254

原创 ThreadLocal知识点补充

ThreadLocal再总结前言之前我的一篇文章Android消息机制——补充完善中大致分析过ThreadLocal,所以这篇文章主要为了补充完善关于它的相关知识。思考问:为什么每个线程中要持有一个ThreadLocal.ThreadLocalMap对象而不是ThreadLocal对象?这个问题的答案,我觉得这篇文章讲的不错:threadlocal为什么这么设计?文章分析了两种ThreadLocal的设计方案:方案一:每个线程可以持有多个ThreadLocal对象,这些ThreadLoca

2020-06-15 12:42:15 176

原创 设计模式——创建型设计模式

文章目录前言创建型设计模式单例模式初始化类时创建单例延迟创建单例简单工厂模式工厂方法模式建造者模式参考资料前言这个系列的文章主要总结《Android进阶之光》中关于这23种三大类的设计模式相关知识。创建型设计模式这类设计模式与创建对象相关,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式定义:保证一个类只有一个实例,并提供一个访问它的全局访问点使用场景:在一个系统中,要求一个类有且仅有一个对象,它的具体使用场景如下:整个项目需要一个共享访问点或共享数据。创建一个

2020-06-14 23:25:59 308

原创 设计模式——六大原则

文章目录设计模式六大原则是什么为什么设计模式的六大原则单一职责原则开放封闭原则里氏替换原则依赖倒置原则迪米特原则接口隔离原则设计模式的分类参考资料设计模式六大原则是什么设计模式是一套代码设计的经验总结为什么设计模式能提高代码复用率、可维护性和可拓展性,降低开发成本和周期;使代码更容易被其他人理解、更加优雅为什么要使用设计模式这个问题,知乎上有位大佬的回答我感觉解释的也比较好:为什么我们需要学习(设计)模式。其中的核心思想就是:为了去学习这些设计模式的思想,让我们更好地组织自己的代码。设

2020-06-14 23:15:30 137

原创 HashMap源码整理回顾

文章目录HashMap源码整理概念基本数据结构构造方法put()get()remove()HashMap源码整理本文基于JDK8分析HashMap源码概念根据键值对来访问存储记录的一种数据结构。基本数据结构JDK7及以前是数组+链表,JDK8开始使用数组+链表+红黑树从它的基本数据结构就可以看出,它处理哈希冲突的方法是链地址法。一些成员变量public class HashMap<K,V> extends AbstractMap<K,V> implement

2020-06-14 23:12:22 137

原创 Glide源码&缓存策略分析

Glide源码分析前言本文分析基于Glide 4.10.0,若有错误疏漏之处,请各位大佬指正。基本使用Glide.with(this).load(strUrl).into(imageView);with(Context context)方法Glide中的这些with的构造方法会绑定传入对象的生命周期,但是为什么要这么做呢?因为退出一个页面时,如果此时还在加载图片,就可能会发生内存泄漏,所以就需要Glide在退出页面时取消加载请求,防止内存泄漏。 @NonNull public s

2020-06-06 10:49:01 283

原创 Java锁相关知识整理

Java锁相关知识整理乐观锁、悲观锁乐观锁与悲观锁是一种广义上的概念乐观锁:乐观锁认为对同一个数据进行并发操作时,其他线程是不会对它修改的,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作。悲观锁:悲观锁认为对于同一个数据的并发操作,其他线程一定是对数据进行修改,因此对于同一个数据的并发操作,悲观锁会对它先进行加锁,确保数据不会被其他线程修改。例如sy

2020-05-28 16:12:35 209

原创 JVM——类加载器总结

JVM类加载器类加载器是什么类加载阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作在JVM外部实现,有利于让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块就称为“类加载器”。类加载器的作用1.实现类的加载过程中加载这个动作2.确保这个被加载的类在JVM中的唯一性注意:只有同一个类被同一个类加载器加载,这两个被加载的类才相等,也就是只有这样它们的equals,isAssignableFrom和isInstance方法返回的结果才为true。类加载器的分类

2020-05-24 16:59:20 157

原创 JVM——类加载机制

JVM——类加载机制什么是类加载机制虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。类加载的时机虚拟机有且只有这5种场景(称为“主动引用”)会对类进行初始化:遇到new、getstatic、putstatic或invokestatic这四条字节码指令。生成这四条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候;读取或设置一个类的静态字段(除被static final修饰的字段)时;调用

2020-05-23 18:11:23 194

原创 JVM——垃圾收集器

文章目录JVM垃圾收集器Minor GC,Major GC 和 Full GCMinor GCMajor GCFull GC安全点和安全区域OopMap安全点安全区域Serial / Serial Old收集器ParNew收集器Parallel Scavenge / Parallel Old收集器CMS收集器G1收集器参考资料JVM垃圾收集器HotSpot虚拟机中实现了如下7种垃圾收集器,“人无完人,金无足赤”,连垃圾处理器也是这样,每种收集器都有各自的优缺点,我们选择的只是针对具体场景最合适的收集器。

2020-05-21 14:02:18 209

原创 JVM——垃圾回收算法

文章目录JVM垃圾回收算法强软弱虚引用判断对象是否已“死”1.引用计数法2.可达性分析算法第一次标记和筛选第二次标记和筛选垃圾回收算法标记-清除算法复制算法标记-整理算法分代收集算法参考资料JVM垃圾回收算法强软弱虚引用这四种引用从左到右引用强度依次减弱。强引用(Strong Reference)程序代码中普遍存在的,我们经常使用的,如Object obj = new Object();这类就是强引用。只要强引用还在,垃圾收集器就永远不会回收掉被引用的对象。软引用(Soft Refe

2020-05-17 19:54:03 263

原创 JVM——Java对象的创建、内存布局和访问定位

文章目录Java对象的创建、内存布局和访问定位对象的创建对象的内存布局1.对象头2.实例数据3.对齐填充对象的访问定位句柄直接指针参考资料Java对象的创建、内存布局和访问定位注:本文所讨论的虚拟机都是指HotSpot对象的创建下面尝试用一张图说清楚这个过程,整个过程中需要注意的点在图中黄色背景的方框中进行说明。在JVM的层面上,对象的创建主要由类加载检查,为对象分配内存,将分配的内存空间初始化为零值,对对象进行必要的设置这几部构成。对象的内存布局对象在内存中的布局分为以下三个部分:1.

2020-05-17 19:51:02 295

原创 JVM——JVM运行时数据区(JVM内存模型)

文章目录前言Java虚拟机结构JVM运行时数据区(JVM内存模型)程序计数器Java虚拟机栈本地方法栈Java堆元空间运行时常量池直接内存参考资料前言Jvm这个系列的文章主要参考大佬Carson_Ho的JVM相关文章来总结《深入理解Java虚拟机这本书》的知识Java虚拟机结构java虚拟机如下第一张图片(JDK1.7及以前),JDK1.8及以后JVM结构中的运行时数据区中的内容有所变化,下面会提到这些变化。java虚拟机包括运行时数据区域、执行引擎、本地接口和本地方法库。类加载系统不属于Jav

2020-05-13 18:03:56 288

原创 操作系统——死锁整理

文章目录死锁一.死锁的概念二.死锁产生的原因三.经典问题三.产生死锁的必要条件四.死锁的处理方法1.死锁忽略2.防止死锁3.避免死锁银行家算法五.参考资料死锁一.死锁的概念死锁是指多个进程在运行过程中因资源争夺而造成的一种僵持状态。在这种状态下,这些进程都无法继续向前执行。再来看看下面这个例子:假设现有一台打印机和一台扫描仪,现在有两个进程分别进行左右的一系列操作,当它们分别执行了1和2两个操作获取了打印机和扫描仪两个临界资源后,两个进程分别要执行3和4操作申请扫描仪和打印机资源,但都申请不到而

2020-05-11 23:51:46 273

原创 轻量型的异步任务类AsyncTask的工作原理

AsyncTask原理前言本文所使用的源码应该比较新(可能是7.0以上,我的Android Studio中好像看不了源码版本),和书中代码稍有出入,但是不影响代码分析。一.概述AsyncTask是一个轻量型的异步任务类,它可以在线程池中执行后台任务,然后将执行进度和结果传递给主线程。先来看看AsyncTask的定义:public abstract class AsyncTask<...

2020-05-06 18:55:50 227

原创 进程和线程以及它们之间的区别和联系

文章目录进程和线程一.进程为什么要引入进程概念进程状态1.就绪状态2.运行状态3.阻塞状态三种基本状态的转换进程调度算法二.线程为什么要引入线程概念线程的运行状态三.线程和进程的区别和联系1.地址空间2.通信方面3.资源4.系统开销参考资料进程和线程一.进程为什么要引入进程为了深刻描述程序动态执行过程的性质,人们引入“进程”概念。概念进程是程序的一次执行过程,是系统进行资源分配和调度的...

2020-05-03 15:02:47 514

原创 Android消息机制——补充完善

文章目录Android消息机制一.概述二.ThreadLocal工作原理三.消息队列的工作原理四.Looper的工作原理Looper的prepare方法:下面康康loop方法:五.主线程的消息循环六.参考资料Android消息机制一.概述Android的消息机制主要指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。Handler的主要作用就...

2020-04-21 21:38:24 218

原创 操作系统之进程的同步机制

文章目录进程的同步机制一.基本概念1.进程同步机制的概念2.为何要引入进程同步机制3.临界资源4.临界区二.进程同步与互斥关系1.同步2.互斥三.进程同步机制的四个基本原则1.空闲让进2.忙则等待3.有限等待4.让权等待四.软件和硬件同步方法1.软件方法2.硬件方法五.信号量机制概述1.整型信号量2.记录型信号量3.AND型信号量4.信号量集六.Linux中的信号量1.定义信号量2.信号量的初始化...

2020-04-20 17:48:45 3106

转载 安卓activity的启动流程

文章目录前言一.概述二. 启动流程2.1 Activity.startActivity2.2 startActivityForResult2.3 execStartActivity2.4 AMP.startActivity2.5 AMN.onTransact2.6 AMS.startActivity2.7 ASS.startActivityMayWait2.7.1 ASS.resolveActiv...

2020-04-15 18:14:11 528

原创 Retrofit的简单使用

文章目录Retrofit的简单使用前言一.简单使用接口说明1.添加依赖和权限2.创建实体类3.创建请求接口4.进行请求请求结果二.注解类型1.网络请求方法(1)@GET、@POST、@PUT、@DELETE、@HEAD(2)@HTTP2.标记(1) @FormUrlEncoded(2)@Multipart(3)@Streaming3.网络请求参数(1)@Header & @Headers(...

2020-03-08 09:58:29 1966

空空如也

空空如也

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

TA关注的人

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