自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HugMua的博客

个人学习笔记总结

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

原创 Composable 可组合项 - 去除点击涟漪(水波纹)效果

针对的是给控件添加点击功能的场景(如Text),通过 Modifier 扩展函数实现。

2024-04-18 17:42:30 103

原创 Kotlin - 时间 Duration

用于表示时间度量,简化了时间单位的换算、计算时间差、操作间隔、比较等场景。

2024-04-10 16:44:40 987

原创 优化 - 数组的查找

【代码】优化 - 数组的查找。

2024-03-23 03:59:08 270

原创 优化 - 排序算法

从左往右比较相邻的两个元素,右比左小就换位,这样最大值就出现在了右边最后一个元素上,再从左边第一个元素开始往右比较到倒数第二个元素,如此重复...

2024-03-23 03:40:08 218

原创 优化 - 数据结构

数据结构:数据存储在内存中的顺序和位置关系,选择合适的数据结构能提高内存的利用率。

2024-03-21 03:17:48 376 2

原创 Java - 数组 Array

数组长度不可改变,在处理固定大小数据的时候性能更好,有增删需求推荐使用 ArrayList,否则需要遍历旧数组对元素进行操作后存储到新数组中,或者遍历旧数组对目标元素位置后面的元素索引+1或-1即整体向前或向后移动1位。内循环一次,最值出现在尾部索引位置。有N个元素排序,外循环 N-1 次,内循环 N-i-1 次。适用于数组中元素数量较大时,但必须保证元素是排好序的(升序、降序)。从头到尾遍历,返回值在数组中第一次出现的位置(即使有相同的元素)。内循环一次,最值出现在头部索引位置。

2024-03-20 22:32:14 368 1

原创 Android - AIDL

定义接口声明功能,手动创建的是 .aidl 文件,调用 IDE 的 rebuild 生成 .java 文件。Module右键→New→AIDL→AIDL File(如果不可选,在 module 的 build.gradle 的 节点下的 节点中添加 aidl true)。在创建的接口中声明抽象方法(IDE生成的默认方法可以删掉,只能用 Java 语法写)。

2024-03-19 00:22:15 880

原创 网络 - 基本知识

Cache-Control是服务器返回的 Response 中的 Header 所包含的信息,目的是告诉客户端从本地读取缓存还是从网络获取。(expires等同于Cache-Control,不过是 Http 1.0 的内容)

2024-02-24 16:07:11 413

原创 网络 - OkHttp

设置好Cache后,同一个地址访问两次打印Log:第一次访问的response.networkResponse( )有内容(来自网络)而response.cacheResponse( ) = null;第二次访问相反,response.cacheResponse( )有内容(来自缓存)而response.networkResponse( ) = null。当某些网络访问获取的内容是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取数据的话,会重复浪费用户和公司的流量费用和带宽占用。

2024-02-24 16:05:12 759

原创 Compose 自定义 - 约束 Constrains

是当前节点宽高的上下界(最大值和最小值)。在 Layout 阶段,当父节点测量子节点的时候会把 Contraints 往下传递,好让子元素知道自己被允许的最大最小尺寸,当所有子元素被测量完成后开始决定自身尺寸时,同样的需要考虑自身的父容器给出的约束。

2024-02-17 00:28:25 376

原创 Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)

这是一个很简单的例子,事实上 Composable 可以包含逻辑和控制流(if else, when...),在不同的状态下产生不同的UI树。同样地,UI树会自顶向下地遍历,每个节点依次在屏幕上绘制自身。然后 Image 绘制自身,再之后到分支节点Column,Column的第一个Text,Column的第二个Text。多叉树中父节点会测量他们的子节点,然后在一个二维空间里进行摆放。2.测量完子节点后,开始决定自身的尺寸。1.如果存在子节点则测量子节点。3.根据子节点的尺寸摆放子节点。

2024-02-16 21:43:58 692

原创 Framework - ActivityThread 应用启动UI渲染流程

拥有 main(String[] agrs) 方法,作为程序的入口,是应用程序的初始化类。

2024-02-02 20:17:21 722

原创 View 自定义 - 一些使用技巧

【代码】View 自定义 - 一些使用技巧。

2024-01-26 22:34:46 356

原创 View 自定义 - 组合已有控件

现有的控件已经有了自己的正确尺寸算法,结果可以作为参考值根据我们的需求进行调整。自定义子类继承自已有的控件。重写 onMeasure(),调用 super.onMeasure() 进行一次原有的测量,通过 getMeasuredHeight()、getMeasuredWidth() 获取测量结果并修改成想要的值。最终调用 setMeasuredDimension() 保存。

2024-01-18 21:01:34 910

原创 View 自定义 - View 体系和方法

View这个类代表用户界面组件的基本构建块。View在屏幕上占据一个矩形区域,并负责绘制和事件处理。View是用于创建交互式用户界面组件(按钮、文本等)的基础类。它的子类ViewGroup是所有布局的父类,它是一个可以包含其他view或者viewGroup并定义它们的布局属性的看不见的容器。单参构造:代码中 new 创建实例的时候调用。双参构造:xml中使用时调用(xml转java代码的时候反射),attrs是xml中的属性。三参构造:使用主题Style的时候调用。

2024-01-16 19:06:05 814

原创 Android 架构 - 模块化 Modularization

模块指 Android 项目中的 module,通常会包含 Gradle 构建脚本、源代码、资源等,模块可以独立构建和测试。相反,如果一个模块的两个部分不经常交互,它们可能应该是单独的模块。:数据模块的公共 API 应该是 Repository,因为它们负责将数据公开给 App 的其余部分。:工具类,也称为帮助类,通常是在应用程序中重用的小段代码。:网络库模块,通常是对三方网络库(如 OhHttp)的封装,简化自定义配置时,减少不必要的重复代码。也称为核心模块或者基础模块,包含其他模块经常使用的代码。

2024-01-08 02:14:02 482

原创 Android 架构 - 组件化 Componentization

继承自 lib_common 中提供的 BaseApplication,组件自定义的 Application 写在 debug 目录中,在集成模式下剔除。(别忘了在下方 debug 目录中的 AndroidManifest 中注册)

2024-01-03 16:22:09 1640 1

原创 Android 架构 - 插件化 Pluginization

待补充。

2023-12-20 23:06:32 592

原创 Compose 组合项 - 滑动列表 LazyColumn、LazyRow

可滚动,类似RecyclerView( Column、Row 用 Modifier 设置滚动是相当于ScrollView)。

2023-12-20 17:50:53 1367

原创 Android 架构 - MVVM

View→ViewModel:View作为观察者,监听ViewModel中数据(LiveData、Flow)的变化从而自动更新UI。ViewModel→Model:ViewModel调用Model获取数据。ViewModel→View:ViewModel作为被观察者,当数据发生变化时,调用接口通知订阅者View更新。

2023-12-17 20:07:24 199

原创 Android - 分区存储 MediaStore、SAF

绝大部分的应用程序都不应该申请这个权限,仅适用于 文件浏览器 类APP,需要跳转到系统页面让用户手动授权,Play商店上架也会更严格。即便得到授权也只能访问 公有目录 + 自定义目录,依然无法访问私有目录。//不加 ignore 属性 AndroidStudio 会用警告提醒。//系统低于11或者方法返回true说明已经拥有整个SD卡管理权限Toast.makeText(this, "已获得访问所有文件权限", Toast.LENGTH_SHORT).show()} else {

2023-12-12 05:55:51 478

原创 Android Studio - 显示配置

路径:Settings→Editor→Design Tools。

2023-12-01 17:06:00 109

原创 设计模式 - 概览

分为三大类、23中具体设计模式。单例模式工厂方法模式抽象工厂模式建造者模式原始模式类结构:采用继承机制来组合接口实现。对象结构:组合对象来实现新功能。适配器模式代理模式门面模式桥梁模式装饰模式合成模式享元模式类行为:使用继承关系在几个类之间分配行为。对象行为:使用对象聚合的方式来分配行为。观察者模式策略模式模板方法模式命令模式迭代器模式调停者模式状态模式责任链模式访问者模式备忘录模式解释器模式。

2023-11-17 23:35:03 367

原创 View 自定义 - 构造和属性 Constructor & Attribute

右键 values 目录 -> New File文件 -> 一般取名attrs.xml。--name使用自定义View的名称-->--name属性名称,format格式-->--枚举-->

2023-11-08 22:41:33 528

原创 View 自定义 - 路径 Path

用于描述顺序 & 区域,单使用无法产生效果。

2023-11-08 17:15:26 81

原创 Compose - 使用 Paging

是对其它数据源的封装,因此和 Repository 定义在同一个 .kt 文件中并私有化。自定义一个类继承 PagingSource 并重写 load() 来提供获取页面数据。}.flow//具体获取数据的方法。这里能更细分的对异常处理,否则在load()中合并返回后在UI中难区分。//但处理后还是要抛出异常,不然load()不会返回异常,影响UI中对Paging状态判断Log.e("服务器错误", it.message.toString())

2023-11-07 17:29:56 504

原创 Compose 组合项 - 下拉刷新 pullRefresh

功能实现采用的是 Modifier 修饰符而不是一个单独的组合项,所以需要提供一个父容器来存放列表和下拉指示器。需求是下拉指示器显示在列表之上,因此选择 Box。

2023-11-04 04:16:36 563

原创 Compose 自定义 - 绘制 Draw

对于自定义绘制,官方为我们提供了三个 Modifier API。在 Lambda 中调用 drawContent() 就是绘制所修饰的内容,由此控制先后顺序,后绘制的会显示在上面。修饰的内容会显示在 Lambda 内容之上(底层是先绘制 Lambda 内容再绘制所修饰的内容,后绘制的会显示在上面)。当绘制复杂效果时,不希望因为重组而重新创建 Lambda 中用于绘制的实例如 Bush、Path 等,这可能会产生内存抖动。

2023-10-28 02:22:29 407

原创 View 自定义 - 概览

从 DecorView 中可以看出 View 的绘制流程开始于ViewRootImpl 对象的 performTraversals(),从视图树根节点(即 DecorView 它是个 ViewGroup)开始由上向下遍历测绘(DecorView→中间层ViewGroup→最底层View)。顶部图中可以看出 ViewRoot 最后一步是绘制,在绘制之前系统会有一些准备,即前面几个步骤:创建PhoneWindow、DecorView、ViewRootmpl。确定控件最终宽高在父容器中的位置。

2023-10-19 19:40:15 122

原创 View 自定义 - 坐标系、位置获取

屏幕的左上角为坐标原点,向右为x轴正向,向下为y轴正向。

2023-10-19 17:52:20 151

原创 View 自定义 - 绘制前的准备 DecorView

图中可以看出 ViewRoot 最后一步是绘制,在绘制之前系统会有一些准备,即前面几个步骤:创建PhoneWindow、DecorView、ViewRootmpl。

2023-10-19 15:40:52 78

原创 View 自定义 - Activity、Window、DecorView、ViewRoot

通过 WindowManager 创建 DecorView 来加载 Activity 的布局,并将它交给 ViewRoot 进行视图绘制和其它交互。Window是一个抽象类,Activity实际持有的是其子类 PhoneWindow,PhoneWindow有一个内部类DecorView。不负责视图控制,真正控制视图的是 Window,它真正代表一个窗口,一个Activity包含一个 Window。管理视图的添加与显示(内部持有一个Window),通过回调与 Window 及 View 进行交互。

2023-10-19 14:26:49 99

原创 Android 优化 - 磁盘缓存 DiskLruCache

用于实现存储设备缓存,即磁盘缓存,通过将缓存对象写入文件系统从而实现缓存的效果。

2023-10-19 01:04:22 476

原创 Compose 组件 - 分页器 HorizontalPager、VerticalPager

类似于 ViewPager,1.4 版本之前需要借助 accompanis 库,底层基于 LazyColumn、LazyRow 实现,在使用上也基本相同。默认情况下 HorizontalPager 占据屏幕的整个宽度,VerticalPager 会占据整个高度。

2023-10-15 02:34:10 1136

原创 Android - Application

通常会将一些初始化代码放在 Application 中,而每当运行指定了进程的组件时都会新建一个 Application 对象,由于不是同一个所以数据不通用,只需要在 Application 类中对当前进程加以判断即可。

2023-10-12 19:40:19 291

原创 Android - AsyncTask

是一个抽象泛型类,由 Android 封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。内部封装了两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handle(InternalHandler)。SerialExecutor 用于任务的排队,让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。

2023-10-11 00:49:51 139

原创 Android - Context

Context 是应用程序和系统之间的桥梁,用于获取全局消息、访问系统资源、调用应用程序级的操作。一般直接调用 Context 的方法或者调用接口时传入Context。Android应用模型是基于组件的应用设计模式,组件的运行要有一个完整的Android工程环境。

2023-10-11 00:04:17 200

原创 Android 优化 - 内存

系统对每个 APP 都有一定的内存限制(设备出厂以后 JAVA 虚拟机对单个 APP 的最大内存分配就确定下来了,位于 /system/build.prop 文件中的 dalvik.vm.heap growth limit),当应用程序使用的内存超过了上限就会出现 OOM (Out of Memory),也就是异常退出。一些会频繁执行的方法例如 onDraw(),每次创建局部变量时内存都会分配给它,但在循环结束后它们不会被立即回收,这将导致内存的不断增加,最终导致内存抖动。

2023-10-07 01:01:34 107

原创 Kotlin 协程 - 协程异常处理器 CoroutineExceptionHandler

异常在局部未 try-catch 处理,会被协程框架捕获(不会再次抛出)经由结构化并发双向传播,该协程会先取消所有子协程再取消自己,如果异常是 CancellationException 类型便到此为止,如果是其它类型会继续向上传播,途中如果没有碰到 SupervisorJob 或 SupervisorScope() 会一直传播到根协程导致整个协程结构被取消,如果根协程没有设置CoroutineExceptionHandler 就会交给线程处理。

2023-09-11 00:08:39 435

原创 Kotlin 协程 - 协程调度器 CoroutineDispatcher

协程必须运行在一个线程上,所以要指定调度器。是一个抽象类,Dispatcher是一个标准库中帮我们封装了切换线程的帮助类,可以调度协程在哪类线程上执行。创建协程时,上下文如果没有指定也没有继承到调度器,则会添加一个默认调度器(调度器通过 ContinuationInterceptor 延续体拦截器实现的)。

2023-09-11 00:02:13 759

空空如也

空空如也

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

TA关注的人

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