自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java】浅谈ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor继承ThreadPoolExecutor,新增了定时、延时任务API,结合两篇基础文章,本篇笔者简单看下ScheduledThreadPoolExecutor是如何实现定时、延时任务。

2025-06-12 11:45:43 236

原创 【Java】Arrays.sort:TimSort

书接前文Arrays.sort对基本数据类型使用了,但是对Object[]类型,则使用了,TimSort是稳定的排序,它整合了,存在策略,本文简单解析下此算法实现。

2025-06-11 15:55:19 477

原创 【Java】简单Cache Demo

本篇是一个关于cache的极简单实例,使用了StampedLock,直接上代码。

2025-06-10 17:50:36 183

原创 【Java】Arrays.sort:DualPivotQuicksort

本文,笔者欲探索JDK内部排序算法实现,并记录心得。其一,Arrrays.sort内部使用的快排是,它相对于普通快排,优化了最差的时间复杂度,毕竟在快排中,如果哨兵选择不当,时间复杂度会瞬间退回O(N^2)。其二,Arrays内部对小数组排序优化,使用了,在小数组中更高效。其三,Arrays支持排序,使用parallelSort即可,并且给出了parallelSort高效临界阈值,低于此阈值不会开启多线程。

2025-06-10 15:11:54 749

原创 【Java】谈谈HashMap

网上关于HashMap解析众多,笔者不妨再多添一篇,以更进一步加深此数据结构的理解。所谓的HashMap,在Java中,是采用数组()+链表方式()实现,它是的,并且具备特性。在java8之后,满足一定条件的链表,会被转换为红黑树,以提高查询效率。那么,先给出几个问题,笔者将带着这这个问题阅读源码。1,散列表下标如何确认?2,什么时候会扩容散列表?3,什么时候转换节点红黑树?4,红黑树节点值的比较原则?

2025-06-09 15:37:04 841

原创 【Java】RxJava解析

RxJava 是 ReactiveX(响应式扩展)在 Java 语言上的实现,它是一种基于异步数据流的编程模式。响应式编程的核心理念是以数据为中心,强调数据的流动与变化。通过 RxJava,开发者可以基于观察者模式实现异步编程和事件驱动操作,从而快速响应外部事件。响应式编程可以将数据流视为一系列按时间排序的事件流,这些流可以被观测、过滤、操作或组合,RxJava 提供了一组丰富的工具和操作符来支持这种编程范式。此框架采用了观察者模式、责任链模式、装饰器模式、策略模式,实现数据流操作。

2025-06-05 14:40:03 988

原创 【Java】使用VarHandler实现无锁Stack

java.utils中Stack,本身继承Vector,而Vector部分方法使用synchronized方法加锁,导致Stack本身操作也是加锁操作,相对来说还是有性能开销的。那么怎么实现轻量级无锁且安全的Stack?可以借助VarHandler原子操作实现。仅供参考,其它高性能数据结构优化可参考。

2025-06-04 16:24:26 268

原创 【Java】CopyOnWriteArrayList

CopyOnWriteArrayList作为List接口的实现之一,它区分于ArrayList在于它是线程安全的。如它名字一样,所有的写操作均复制了原数组的值,虽说代价较大,但读多写少的环境下,是可接受的。笔者在此简单看下实现原理。

2025-06-04 10:59:20 439

原创 【Android】RV折叠适配器

1,折叠List,除了使用ListView中已有的ExpandAdapter,笔者定制化了此类,用户折叠列表的RV通用实现,仅供参考。

2025-06-04 10:23:46 253

原创 【Compose】扫雷游戏

扫雷。

2025-06-03 17:19:07 222

原创 【Android】双指旋转手势

本文参考android.view.ScaleGestureDetector,对双指旋转手势做了一层封装,采用了向量计算法简单实现,笔者在此分享下。

2025-06-03 15:19:08 256

原创 【Java】LockSupport#park

熟悉AQS源码的读者都知道,线程的挂起是使用LockSupport#park,unpark方法,它相对于Thread#stop是绝对安全的,因为park方法只能在当前线程调用,而当前线程对于是否挂起当前线程逻辑,是清晰明了的,而非暴露Thread#stop方法那样,可以由其它线程stop任意一个线程,stop线程对目标线程的执行存在不确定性。unpark由其它线程唤醒,这是安全的,因为是挂起状态->运行状态,其唤醒点是从park行执行,也是目标线程内部正常逻辑。

2025-06-03 11:05:45 346

原创 【Java】DelayQueue

本文简单介绍下延迟队列,顾名思义,加入队列的元素具备延时出队的特征,在诸如延迟消息时可简单使用,本文笔者以学习心态简单介绍下此数据结构。DelayQueue实现类图如下DelayQueue实现Queue接口,内部保存一个优先级队列,新加入队列的元素必须实现Delay接口,实现getDelay和compareTo方法,以满足优先级队列排序,以及出队延迟计算。

2025-05-27 15:04:53 285

原创 【Java】Stream

Stream是责任链设计模式的典型实现,笔者此处只简单记录下,不深入。

2025-05-27 11:26:32 336

原创 【Android】SharePreference原理

SharePreference作为轻量级应用偏好持久化存储API,可以简单存储一些key-value值,其实现是基于file系统,在应用data/xxx/shared_prefs路径下,保存了xml文件,而实现存储。本文,基于SharePreference的基本使用,到其内部实现,做一个简单介绍。

2025-05-26 14:53:32 1141

原创 【Android】动画原理解析

基础动画,有四种,分别是平移(Translate)、缩放(Scale)、Rorate(旋转)、Alpha(透明度),对应Android中以下四种。

2025-05-08 17:57:13 1091

原创 【Android】36原生Settings新框架PreferenceFragment

Aosp中Settings新增PreferenceFragment,旨在使用声明式UI取代XML解析UI方式,一则提高了页面跳转速度,省去xml io耗时,二则配合SDK36中AbstractPreferenceService新API,解耦了各模块直接通过SettingsProvider设置的数据耦合。

2025-04-30 11:47:38 690

原创 【Android】自定义Trace

以下,android.os.Trace公开了以下API1,beginSection与endSection联合使用,只能在同一个线程2,beginAsyncSection与endAsyncSection可以在不同线程使用,zhuyi以下是WallpaperService中的片段3,setCounter是计数器,以MessageQueue为例。

2025-04-29 11:39:40 272

原创 【Android】SettingsPreferenceService

AndroidSDK36平台,新增了SettingsPreferenceService类,位于SDK中android.service.settings.preferences下,主要作用是提供。该功能组件如下,采用CS架构,通过binder实现与设置的通信客户端API集成在SettingsPreferenceServiceClient类中,目前提供了三个公开接口,

2025-04-28 15:39:17 786

原创 【Android】谈谈DexClassLoader

DEX 文件(Dalvik Executable)相较于普通的 JAR(Java 字节码 .class 文件)进行了多方面的优化,主要是为了适应 Android 设备的性能和资源限制(例如内存、存储空间和处理能力)。以下是 DEX 文件的一些具体优化点:1.DEX 文件将多个.class文件,即代码中多个java文件,合并到一个文件中,而不是像 JAR 文件那样每个java文件编译后生成多个独立的.class文件。这减少了文件头和元数据的冗余,节省了空间。

2025-04-28 11:04:25 1015

原创 【Java】谈谈ClassLoader

类加载器,顾名思义,就是通过class字节码生成Class对象的类以下是ClassLoader的基本用途,即通过bytes字节码,生成一个class实例对象,

2025-04-27 11:40:51 467

原创 【Java】jdk动态代理

jdk动态代理,指通过Proxy.newProxyInstance方法回来的实例对象,通过InvokeHandler接口实现切片编程的方式。此为代理模式,能在不改变原类的基础上,对类实现前置、后置增强,最小化嵌入功能逻辑,实现解耦。注意,此方式只能代理实现接口的类,它的实现原理是生成一个接口简单实例类的字节码,通过ClassLoader.defin方法解析生成的字节码,得到一个Proxy Class。

2025-04-27 10:30:27 374

原创 【Java】BitSet简介

工欲善其事必先利其器,好的数据结构搭配算法,才能高效完成一些较难的任务。此次介绍BitSet数据结构,但在介绍之前,先思考一个问题。如果在16G的机器上,高效去重40亿个整数(Int)?40亿整数约160G内存,显示全部写进机器中,内存不够。如果使用BitSet,由于最大的整数不超过2^31-1 bit,约256MB,因此,从磁盘中依次读取整数,通过BitSet标记则可判断整数是否存在。随后,遍历BitSet,标记为1的则是存在的整数,否则不存在,因此这么做,还算得上计数排序的思维。

2025-04-25 11:09:23 374

原创 【Android 】ContentProvider深度解析

应用间数据共享,查询,可通过Android四大组件之一,ProviderContent组件完成。As Android Dveloper,跨进程数据共享有多重形式,如Socket、管道、共享内存、Binder等,Android所提供的ProvierContent组件,本质是封装了Binder的一种通信方式,实现了跨进程的数据共享。内部提供了增删改查、Call之类的方法,跨进程基本数据类型的通信还是比较的。此外,此组件还提供了监听功能,可对感兴趣的数值监听,实时query。

2025-04-17 15:41:34 1063

原创 【Android】LiveData深度解析

1,LiveData是状态订阅组件,是粘性的,而非事件订阅组件(可以没有事件,但不能没有状态)。所谓的状态,即UI状态,同一时刻只存在一种,且是最新状态,过期的状态应该被遗弃。事件,则是生产者创建的事件,需一一消费,不能被遗弃。2,Android页面承载组件Activity,本是存在多种生命状态(Create,Start,Resume,Pause,Stop,Destroy),UI状态的发布,取决当前Activity(或者Fragment)是否已经Resume(即或已经前台可见)。

2025-04-16 14:55:56 1036

原创 Android掉帧分析

掉帧,即每个vsync信号到来时,应用无法送帧(doFrame太长)或者SurfaceFinger无法合成帧,导致对应进程视图缓冲变0,出现的抖动现象。此时,便需要应用开发进行性能分析,定位问题根源。

2025-04-15 14:37:47 940

原创 【Android性能】Perfetto-View分析

可通过android sdk中自带的systrace抓取,路径一般如下,..\AppData\Local\Android\Sdk\platform-tools,切至python2.7,run,随后进行相关操作,操作完毕后按回车即可获取trace文件,找到run_systrace.py中parse_options方法,对应代码块。此次以Settings冷启动为例,找到com.android.settings。随后trace_files下出现一个ctrace文件,再通过。怎么分析不是本文重点,

2025-03-18 14:43:09 691

原创 【Android】ListView控件在进入|退出小窗下的异常

页面使用了ListView控件,随后进入小窗模式,导致视图遮挡。

2025-03-17 09:35:40 549

原创 【Java】StampedLock浅谈

在多读少写的环境,相比于ReadWriteLoock,StampedLock性能更胜一筹。试着想一下,如果使用ReadWriteLoock,当1万个读请求过来时,写的操作插入,就会被阻塞。但StampedLock不会,后者不基于AQS实现,它采用乐观锁的思维。所谓的乐观,即读取的时候,不会阻塞当前线程,相应会返回一个邮票,state。读取完毕后,只要验证手上的邮票判断数据是否变化即可,随后决定去重新读取数据。本文笔者简单讲下StampedLock的实现思路,以供参考。

2025-02-27 14:47:31 609

原创 【Java】ReadWriteLock浅谈

在多读少写的场景下,可以使用读写锁优化性能。读写锁本质是一种共享锁,即,如果ReadLock获取锁成功,只会阻塞WriteLock锁的获取,不会阻塞其它线程ReadLock锁的获取。

2025-02-26 16:06:06 534

原创 【Android性能】内存泄漏分析策略

Android系统应用+Framework层基于Java进行开发,其无用的对象依赖GC机制回收,如果一个对象被持久对象引用,则不会被GC,导致应用内存持续上涨,直到发生OOM异常。本文,笔者根据自身经验,梳理一些常见的内存泄漏点,以及解决方案。Java采用了多种垃圾收集算法,具体使用的算法可能会根据JVM的实现和配置而有所不同。标记-清除算法(Mark-Sweep):复制算法(Copying):标记-整理算法(Mark-Compact):分代收集算法(Generational Collection):被GC

2025-02-25 11:52:05 693

原创 Android Vsync从何而来

但USE_VSYNC现为true时,信号就直接来自底层,因此,doFrame方法实际在FrameDisplayEventReceiver#onVsync中被调用。DisplayEventReceiver通过nativeInit方法注册receiver。以上,USE_VSYNC为false,android上层计算时间。简单记录一下ChoreographerdoFrame执行时机。从实际堆栈进一步可确认。

2024-12-06 11:12:13 176

原创 【Android】android compat理解

即便是在同一手机上安装的不同apk,其编译的apk不同,也会导致行为上的差异。如SDK34有限制后台启动,但如果安装的apk所依赖的sdk是33,则不会表现出此差异。这是如何实现的呢?其实,本质是依赖系统端的compat config逻辑。简单说,系统会根据客户端的sdk值,判断是否启用某feature,来达到向后兼容的手段。核心实现在/下面。

2024-11-22 14:01:19 789

原创 从进程到协程,浅谈Java提高CPU利用率的发展

综合CPU利用率来讲,计算机远古时期,为提高CPU利用率,有以下概念。

2024-07-01 16:58:13 486

原创 ForkJoinPool浅析

相比传统的线程池ExecuteService,ForkJoinPool的优势在于能采用分治算法、工作窃取算法高效利用CPU资源,如下图Fork即拆分,Join即合并,通过将大任务拆分成多个小任务,在多个线程中执行后,合并结果即可得到大任务的结果,经典的例子有归并排序、超大数组求和等。ForkJoinPool主要mode如下:ForkJoinPool:ForkJoin线程池。ForkJoinThread:特殊线程池。

2024-06-28 17:02:44 386

原创 线程池FutureTask浅谈

FuturnTask实现了Future与Runnable接口,笔者知道,ThreadPoolExecutor#submit可以传入Callable接口而非Runnable,区别点在于Callable可以返回值,而整个FuturnTask可以理解为Callable设计,用来优雅地异步获取执行结果,无需手动Condition去实现。围绕此,需知道Future接口及其方法的定义,

2024-06-27 15:59:21 795

原创 androidx.preference框架介绍

Preference作为setting核心框架,笔者对此框架做一个简单的解析,androidx.preference本质是对设置领域提供了一层View封装,以android view本身的策略模式进行二次开发,将常用的一些设置样式封装到不同的Preference中,以达到快速开发设置相关功能。并且,此风格与原生setting保持了一致,给用户提供了一致性体验。

2024-06-25 10:20:21 1246 3

原创 Android Activity因配置改变重建,ViewModel#onClear方法为什么不被调用?

注意到切换语言或字体大小改变时,Activity会发生重建,但对应的ViewModel却不会被clear,甚至在重建的Activity,通过new ViewModelProvider(this).get(ViewModel.class)也是上一个Activity的实例,为什么呢?上述问题发生的条件是当前Activity需要是ComponentActivity的子类。

2024-05-13 10:46:48 611 1

原创 线程池原理简谈

线程池是一种池化技术,本质是减少线程对象创建销毁的开销,同对象池、连接池一样,达到对象复用的效果。那么线程池怎么复用呢?即一个或多个Thread对象怎么执行更多的Task?这里面的关键就涉及到了阻塞队列。其一,所谓阻塞队列,是借助锁实现的生产-消费模型,以BlockLinkedList为例,其taskFirst方法,通过notEmpy,即Condition实现阻塞等待功能,而Condition内部使用了AQS来实现锁的功能,详情可见。

2024-05-11 14:58:37 918 1

原创 Gson源码解读

gson作为流行的json工具,笔者使用较多。本文主要目的是解读下Gson的源码实现,就没有然后了。

2024-02-02 14:57:36 1461

systrace.zip

systrace.zip

2025-03-11

jadx-gui-1.3.4-with-jre-win.zip

jadx-gui-1.3.4-with-jre-win.zip

2024-11-07

空空如也

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

TA关注的人

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