- 博客(146)
- 资源 (1)
- 收藏
- 关注
原创 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
原创 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
原创 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编译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
原创 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时间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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人