自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(146)
  • 资源 (1)
  • 收藏
  • 关注

原创 Flow的进阶学习2025

LiveData:简单,可靠。缓存最新数据+生命周期感知。Flow:把简单复杂化,又把复杂简单化。

2025-08-08 18:33:26 678

原创 android10~16变更一览和开发者兼容应对

android近期新特性和我的一些处理。

2025-08-06 18:30:47 1213

原创 kotlin协程2025 通俗易懂三部曲之下篇 异常处理

本文总结了Kotlin协程异常处理:CoroutineExceptionHandler、try-catch和结构化并发机制。文章详解了不同作用域(coroutineScope/supervisorScope)的异常传播特性:coroutineScope会双向传播异常导致整个作用域失败,而supervisorScope仅单向传播不影响其他子协程。通过多个代码示例展示了try-catch在不同场景下的有效性差异,并指出在多层嵌套协程中异常处理的局限性。特别强调结构化并发中异常会沿Job层次结构传播的特

2025-08-06 14:08:40 923

原创 kotlin协程2025 通俗易懂三部曲之中篇 常用函数和并发处理

这篇文章是Kotlin协程三部曲的中篇,主要讲解协程的重要函数用法和并发处理。文章介绍了协程函数:runBlocking, withContext, suspendCancellableCoroutine, withTimeoutOrNull/withTimeout, coroutineScope和supervisorScope等。并介绍了如何根据场景使用哪种并发处理。

2025-08-06 12:54:14 660

原创 kotlin协程2025 通俗易懂三部曲之上篇 用法全解

本文是Kotlin协程系列教程的上篇,主要介绍协程的基本用法。内容包括:协程的概念(轻量级线程,基于状态机实现),核心组成要素(CoroutineScope作用域、CoroutineContext上下文、launch/async启动方式),以及最佳实践建议。

2025-08-06 11:46:56 1164

原创 Android官方架构指南2025融会贯通

Android架构指南核心思想总结 本文总结Android官方架构指南的核心原则和分层设计思想,强调现代化Android开发应遵循的关键点: 架构原则 关注分离:避免Activity/Fragment臃肿,界面类仅处理UI逻辑 数据驱动:数据独立于UI组件生命周期,确保持久化和离线能力 单一数据源:数据集中管理,通过不可变类型公开 单向数据流:状态向下流动,事件向上传递(UI→ViewModel→Model) 远离Context:ViewModel和数据层不引用Context 分层架构 界面层:View/C

2025-08-04 01:30:48 978

原创 android MVC/MVP/MVVM/MVI架构发展历程和编写范式

本文对比了MVC,MVP,MVVM,MVI架构在android上的发展历程和实现的代码开发范例。文章指出架构本质是思想而非教条,开发者应重点把握数据驱动、单一数据流等核心原则,而非严格遵循某种模式。随着Jetpack组件的出现,现代Android开发已融合了MVVM和MVI的影子,形成了更灵活的开发范式。

2025-08-01 16:42:19 743

原创 kotlin StateFlow的两个问题和使用场景探讨

本文探讨了在Android开发中使用StateFlow和SharedFlow替代LiveData的实践与问题。文章首先指出日常开发中99%的场景只需单次请求展示,LiveData已足够适用。随后介绍了基于StateFlow的状态管理模板规范,包括状态封装类定义、ViewModel声明和UI层collect操作。重点分析了StateFlow的两个主要问题:1)生命周期变化导致的重复触发;2)数据相同不触发的去重特性。作者通过对比指出SharedFlow更符合替代LiveData的需求,因其无初始值、不自动去重

2025-07-29 16:38:57 695 5

原创 Android TabLayout indicator宽度

android TabLayout的indicator的宽度定制。

2025-07-24 11:07:27 486

原创 kotlin Flow快速学习2025

本文介绍了android kotlin Flow的常规使用,常规操作符,StateFlow、SharedFlow等,并对比了Channel,LiveData等。

2025-07-20 20:01:46 915

原创 android ROOM kotlin官方文档完全学习

使用 Room 将数据保存到本地数据库 | Android Developers (google.cn)1.2 三大组件DataBase,用于保存数据库并作为应用持久性数据底层连接的主要访问点。Entity,用于表示应用的数据库中的表。DAO(数据访问对象),为您的应用提供在数据库中查询、更新、插入和删除数据的方法。1.3 快速示例1.3.1 定义User类定义User数据实体。每个实例代表数据库user表的一行。详细使用参考第二章【使用Room实体定义数据】。用来操控user表的数据

2025-07-18 00:36:16 1198

原创 View的加载过程

上层app通过Surface获取buffer,供上层绘制,绘制过程通过Canvas来完成,底层实现是skia引擎,绘制完成后数据通过Surface被queue进BufferQueue, 然后监听会通知SurfaceFlinger去消费buffer, 接着SurfaceFlinger就acquire数据拿去合成, 合成完成后会将buffer release回BufferQueue。一个window,对应一个Surface,其实在ViewRootImpl里面,app进程中,hardwareRender。

2025-06-06 11:22:17 548

原创 android ViewModel liveData无法监听之多线程下activityViewModels不安全

对于项目中存在的unsafeLazy的,不仅仅是针对viewModel,都建议检查你是否有可能多线程竞争问题;如果,多创建一次对象没啥影响的就无所谓就继续使用。有任何可能,就改成lazy。对于viewModel的初始化,推荐方案1和方案2。不推荐官方的写法。如果用官方写法,请自行把握viewModel的触达,确保最早在主线程中被创建。

2025-05-08 11:20:43 518

原创 startService的常规做法2025

android在不同阶段Service有不同的限制。申明Service,和permission。

2025-02-05 15:41:53 536

原创 overridePendingTransition和overrideActivityTransition

那么,兼容起来是比较麻烦的。可以思考如何从基类Fragment/Activity着手哦。经过尝试,如此去兼容2种api。看来你不得不都这样加上了。

2025-01-16 10:44:45 373

原创 通过gradle发布aar或jar携带sources-jar到maven nexus

找了很久,没有找到满意的。终于找到一个好的办法。gradle7.x适用。比以前的写法简洁。

2025-01-07 10:29:35 657

原创 android EditText密码自动填充适配

手机厂商一般会默认带一个。三星叫做pass,iqoo叫做密码保险箱,小米叫做智能密码管理。第三方的有,google框架,lastPass,bitwarden等。以上是自动填充服务。然后,就是需要我们app做的事情,适配自动填充。

2024-12-20 15:17:53 828

原创 android EditText输入太长自动换行

android:lines=“1”, maxLines并不能限定他是否会自动换行。

2024-12-17 11:12:31 324

原创 android编译assets集成某文件太大更新导致git仓库变大

不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大,好几G。当时我没有想到好办法。拓展:虽然可以通过来只check out最新的。但是commits又不太好出现。虽然我还有–unsallow的办法…始终不太好弄。但是现在我工作的团队,也有类似的,每次发包或者debug包都可能需要更新某个zip包,好几十MB。

2024-12-06 17:13:59 481

原创 kotlin android Handler removeCallbacks runnable不生效的一种可能

这是因为kotlin认为,Runnable等价于 ()->Unit. 坑就这里。它会帮你把()->unit函数转成Runnable传过去。比较老的解释就是因为messageQueue已经即将执行的不能被取消,这种我们很好理解它, 因为他已经在跑了,自然无法移掉。可以看到箭头函数会被编译成Function对象。android Handler无法移除runnable。

2024-10-31 14:07:55 749 1

原创 android含有EditText的键盘弹出后界面的正确处理

再给它套一层FrameLayout,设置android:fitsSystemWindows=“true” , height必须MATCH_PARENT;android布局中含有EditText是一个蛮难处理的场景。因为包裹它的布局不同和activity的softInput不同产生的界面变化是不一样的。然后activity android:windowSoftInputMode=“adjustResize|stateHidden”。这些条件组合起来会得出不同的结果。必须这样做才是最正确的。

2024-09-12 16:31:55 960

原创 materail3 CircularProgressIndicator和LinearProgressIndicator有难看的白块和断点

看看,连老外都在吐槽,https://www.reddit.com/r/androiddev/comments/19bwskv/is_the_new_material_3_linear_progress_indicator/?rdt=44295。这种设计实在是令人费解。它的原出处在这里:https://m3.material.io/components/progress-indicators/overview,官方设计。横线进度条,有尾部亮色,进度处又有分割。圆圈的进度条有断点,不连接;

2024-09-07 18:49:32 643

原创 在线制作9png的好网站

https://inloop.github.io/shadow4android/fook : https://github.com/inloop/shadow4android

2024-08-23 15:50:00 955 2

原创 AppBarLayout滚动吸顶有额外的颜色

CollapsingToolbarLayout 的 contentScrim。AppBarLayout 的 liftOnScrollColor。

2024-08-08 17:01:02 320

原创 基于RecyclerView下拉刷新框架拉伸效果微调

同时,还可以套入到NestScrollingChild和Parent的框架中继续分发事件。因为这个拉伸效果,其实就是代表了recyclerView消费(consumed)掉了y的距离。而通过上述代码禁掉了顶部的拉动效果,事件就能分发到父控件上。这样recyclerView的效果比较好看。往下拉,没有微微的拉伸动作。而到了底部往上继续拉有微微的拉动效果。通过使用上述代码,我们只禁用了顶部的下滑动作,其他动作保留。如果你是横向的,可以自行参考。通过上述代码,来阻止事件被上层view截获,解决误触严重的问题。

2024-08-07 17:41:20 400

原创 一种全局数据变化而且是多个的通知实现

从activityA,打开activityB, activityC 或者还存在viewpager上的其他Fragment。这种情况下,当操作了某个界面的Bean数据,更新当前自己是很容易的;但是当想更新其他界面,其他activity就比较麻烦了。这个简易的框架的目的是当onResume状态下,就把当前通知的单条变化给到;在这些界面上,大家都有相同的数据Bean(name, info, isFavourite)去展示成卡片列表。在更新数据的时候,changeData.notify(bean)。

2024-07-19 18:18:21 439

原创 我“硬刚”mmkv开源库对于版本号的定义赢啦!

可以看到,他们吸取的建议了,后续版本号将定为2.0,而且长期支持1.3.7(当然只是修正bug不再上新功能),并加了回来armV7和x86的库,前情是这个帖子https://blog.csdn.net/jzlhll123/article/details/139917169。而对于我们普通程序员而言,看到gradle有黄色提醒,我们有版本升级了,而且仅仅是第三位的升级,自然就给升级上去了。然后,时间过去了2周,看着越来越多的人给他提issue,看来他们也抗不住了。于是,经过我的多方研究,所以,对于这个事情,

2024-07-08 18:24:15 632

原创 android2024 gradle8 Processor和ksp两种编译时注解实现

android的编译时注解,老生常谈,外面的例子都是bindView,脑壳看疼了,自己学习和编写下。而且现在已经进化到kotlin2.0了,google也逐渐放弃kapt,进入维护状态。所以要好好看看本贴,基于最新的gradle8.6,kotlin2.0+,介绍kapt,ksp的写法。

2024-07-05 19:50:48 2105 6

原创 android deep links即scheme uri跳转以及googlePlay跳转配置

android跳转scheme uri的使用和问题总结

2024-07-04 10:52:45 1055 1

原创 android模糊背景的实现

简单使用就是设置一个app:blurOverlayColor即可。android上模糊后期已经通用了基本上就是RenderEffect。为了使用方便简便找到一个合适的库。

2024-07-02 09:58:13 1111

原创 android iconfont带图标的图文并茂的一种实现

android使用iconfont实现图文并茂

2024-07-02 09:48:37 451

原创 UnsatisfiedLinkError libmmkv.so not found

以前我发过一个帖子https://blog.csdn.net/jzlhll123/article/details/135248574,对于更老的手机,由于很早之前mmkv就不支持很老很老的架构了。没有默认的lib armeabi目前这种机器,确实只占不到1%,我们就忽略了。而如果你是googlePlay发布的话,由于平台又做了cpu架构的区别分发,用户v7a手机下载到的真实程序就没了。从打包后的包解压可以看到,只有arm64-v8a和x64目录里面有库。而1.3.4打包解压后,是4个目录有的。

2024-06-24 10:23:15 1237

原创 升级gradle8.x无法编译aar上传maven without declaring an explit or implicit dependency

提示generateMetadataFileForReleasPublication without declaring an explit or implicit dependency.以前,我们通常是通过。

2024-06-18 17:05:59 434

原创 kotlin1.8.10问题导致gson报错TypeToken type argument must not contain a type variable

原因就是字节码写了new出来的匿名内部类是个带T的,所以因为JVM上泛型擦除出现了T,gson的TypeToken就无法解析到真实的类,因此出现了问题。或者参考我上篇帖子https://blog.csdn.net/jzlhll123/article/details/139302991的三个解决方案。书接上回,https://blog.csdn.net/jzlhll123/article/details/139302991。我后来又通过在demo工程中尝试,怎么都无法复现,困扰了我好几天。

2024-06-02 23:13:34 1071

原创 gson解析出现IllegalArgumentException: TypeToken type argument must not contain a type variable

让我们从头来捋一下。cmdcmd2上述代码呢,我们的目的是这样的:我们有一个实体类MyCmd, 由于cmdData的类,可变,他的真实类可能是Class1,Class2…我们想要做的事情呢,就是把MyCmd里面的基础字段,比如deviceId等进行修改。再还原回去。在gson2.10.1的库,上述代码是不会报错的。经过调试:我们可以看到,由于泛型传入的是Any(java则是Object),gson帮我们将cmdData解析成了LinkedTreeMap,这是他内部的结构。

2024-05-29 20:36:34 1583 1

原创 firebase如何自定义上传日志

官方文档https://firebase.google.cn/docs/crashlytics/customize-crash-reports?就是你必须在一堆log函数调用以后,调用recordException才行。这就是firebase提供的自定义日志和excption上传的方法。但是如果你认为log函数调用后,直接就能查看到日志就错了。我们会容易忽略这句话,“将日志与您的崩溃数据相关联”。所以遍查stackoverflow得到了解释,我们在这个page是找不到日志的。

2024-05-29 14:54:49 904

转载 android WebView无法弹出键盘

然后再重新运行下,看是不是ok了。问题原因处在最后的defStyleAttr,不能设置为0,应设置为com.android.internal.R.attr.webViewStyle!具体这个styleable里的参数是什么,暂且还未找到相关代码。有找到的朋友也欢迎分享下!原文链接:https://blog.csdn.net/Aran_biubiu/article/details/108326075。检查下你的WebView是否是自定义过的。如果是的话,构造方法注意一下,如果写法如下图所示则无法弹出。

2024-05-28 17:47:08 206

原创 android Seekbar当点击的时候有一个圆圈

通过修改background为null,就能不显示了。

2024-05-28 17:45:47 710

原创 android时间textView不等距导致宽度跳来跳去自定义View解决

android时间textView显示不等距导致宽度跳来跳去的原因是,大部分字体,0~9的数字的宽度是不等距的,因此当显示时间的时候,由于组合不同,就会导致宽度不同,时间看上去就会跳来跳去。因此解决办法有2个。第一,使用monospace的字体库。第二,就是今天我要说的自定义view来解决了。

2024-05-24 09:40:34 397

原创 【大道至简】官方兼容到android13+的获取系统屏幕高度, statusbar,navBar

android在屏幕高度和app高度,statusbar, navigationbar的高度处理上,迭代了好多版本。android11, android12都有新的api和过时的api标记。涉及的api太多。现在终于找到官方支持的库。分享给大家。

2024-05-14 21:27:08 1447

HDThanhua_super_v0.9.2.zip

HDThanhua_super_v0.9.2.zip

2016-08-06

空空如也

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

TA关注的人

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