- 博客(77)
- 收藏
- 关注
原创 Java进程同步
场景进程A写文件,进程B读文件,进程B需要进程A写完才能读。方案java.nio.channels.FileLock 文件锁FileLock 是进程文件锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问。每次通过FileChannel类的lock或tryLock方法获取文件锁时,都会创建一个文件锁对象。文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁(对文件加锁),要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。一旦某个进
2020-05-24 17:05:57
910
原创 从源码角度理解Handler消息机制
Handler是Android中的核心机制。通过Handler可以将Message发送到Handler所在线程对应的MessageQueue中。每一个Handler实例都只会属于唯一一个线程,也只会对应唯一一个MessageQueue。源码解析使用Handler第一步都要实例化,来看看Handler的构造函数://默认构造函数,将会使用当前线程对应的Looper,如果当前线程没有Looper则会抛出异常public Handler() { this(null, false);}//传入
2020-05-17 23:42:15
391
1
原创 Flutter兼容性问题:Namespace not specified
部们有一个原生项目和一个Flutter项目,现在要把Flutter项目融入到原生项目,因此技术架构采用的是原生+Flutter混合开发模式。AGP 8.0+ 要求所有模块必须在 build.gradle 明确声明 namespace,不再从 AndroidManifest.xml 的 package 属性自动推断。用一种能强制注入属性到子 module 的方式。
2025-10-29 14:38:57
357
原创 Flutter兼容性问题:Could not get unknown property ‘flutter‘ for extension ‘android‘
部们有两个项目,一个原生项目,一个Flutter项目,现在要把Flutter项目融入进来,于是技术选型是采用原生+Flutter混编方式,因为Flutter项目用了第三方插件gal,于是引入进来以后报错了:解决方案在宿主工程根目录下的build.gradle文件(不是.android/build.gradle文件)加入如下代码:感谢大家的支持,如有错误请指正,如需转载请标明原文出处!
2025-10-29 10:46:28
372
原创 随音舞动:Visualizer实现音频律动效果
在许多音乐类 App 中,播放音频时的**律动柱状图(Spectrum)**或波形可视化是一个令人愉悦的视觉效果。本文将介绍如何在 Android 中实现音频播放时的“跳动效果”,从最基础的到不需要录音权限的。如何正确使用Visualizer实现波形/频谱捕获为什么需要录音权限如何使用 ExoPlayer 自定义 FFT 处理如何绘制一个平滑的柱状律动视图。
2025-10-25 12:11:58
766
原创 Android 程序员如何系统学习 MQTT
1 周入门:用工具体验发布/订阅,理解协议。1 个月实践:在 Android 项目中实现基本收发消息。3 个月进阶:掌握断线重连、安全认证,完成实战项目。通过这个计划,你将从“能用”走向“精通”,真正把 MQTT 应用到 Android 项目中。
2025-09-29 09:23:26
588
原创 Kotlin Value Class 全面解析:类型安全与零开销封装
Value Class(值类)是 Kotlin 1.5 引入的正式特性,用 @JvmInline value class 定义。在编译期,它是一个独立的类型(提供类型安全);在运行时,它会被编译器优化为其内部包装的值(零开销)。value class 是类型安全的轻量级封装,本质上就是“没有运行时开销的包装类”@JvmInline${
2025-09-28 15:40:54
619
原创 Flutter Monorepo 管理神器:Melos 使用指南
Melos 是 Flutter/Dart 社区的多包管理工具,灵感来自于 JavaScript 世界的 Lerna。它专为Monorepo 场景自动处理包之间的依赖关系统一执行脚本和命令批量运行分析、测试、构建自动管理版本和 Changelog简化发布流程(一次性发布多个包到 pub.dev)换句话说,Melos = Monorepo 管理器 + 脚本执行器 + 发布助手。自动化依赖管理(只是管理依赖关系,不负责创建模块)统一化命令执行高效的版本发布更适合大型团队协作。
2025-09-06 21:07:50
1195
原创 Flutter常用库集锦
业务开发:Provider/Riverpod、dio、cached_network_image、shared_preferences快速迭代:GetX、hive、flutter_screenutil、flutter_native_splash企业级架构:Riverpod/Bloc、go_router/auto_route、dio+retrofit、Melos、fvm工程化:Melos(多模块)、shorebird(热更新)、fastlane(自动化打包)
2025-09-06 14:14:26
1204
原创 开发笔记-Android无侵入验证实现
因为项目采用的是组件化架构,跳转到商业化购买页面使用的是Arouter,因此最后选取了第二种方案,通过Lifecycle的addObserver方法进行监听。用户触发某类操作合计3次以后,再次触发某个操作,要先主动触发商业化购买弹窗,用户从商业化购买页面返回以后继续之前的操作,主要目的是提升付费转化率。
2025-08-27 11:20:33
347
原创 自定义ViewPage2滑动切换效果
默认效果虽然简洁,但往往不能满足个性化需求。轮播图:滑动时缩放,突出中间页面,弱化两侧页面;阅读器/相册:左右切换时淡入淡出,避免突兀感;卡片浏览:滑动时叠加旋转,增强层次感。这些效果都可以通过 ViewPager2 的 PageTransformer 接口 来实现。页面越靠近中心,缩放比例越大,透明度越高;侧边页面缩小并半透明,突出中间页面。
2025-08-18 17:27:19
844
原创 Android 流式布局实现方案全解析
在日常 Android 开发中,经常会遇到 流式布局 (Flow Layout) 的需求,比如:所谓“流式布局”,就是子 View 按行排列,如果一行放不下,就自动换行,类似于 HTML/CSS 的 flex-wrap: wrap 效果。那么在 Android 中,如何实现流式布局呢?Google 官方开源的 FlexboxLayout 是实现流式布局的首选,它模仿了 CSS 的 Flexbox,支持换行、对齐、弹性伸缩等特性。引入依赖:对应的仓库地址:动态添加✅ 优点:官方维护,功能完善,属性和
2025-08-18 10:07:22
604
原创 RecyclerView 拖拽与滑动操作
重写 onSelectedChanged() 和 clearView() 来在拖拽开始与结束时修改选中项的视觉(如背景色变更等)配合 ItemAnimator 可实现平滑位移动画= null) :): Int {// 支持向上向下拖拽,向左滑动val swipeFlags = ItemTouchHelper.START // 或 END= null。
2025-08-14 21:53:25
869
原创 DevOps平台结合Gradle实现打包流水线
在现代软件开发中,持续集成与持续交付(CI/CD)已成为团队提速、降本增效的核心实践。Gradle作为强大的自动化构建工具,常被用于Android与Java项目的构建打包任务。而将Gradle集成进企业的DevOps平台中,不仅可以标准化构建过程,还能自动化打包、测试、发布的全流程,大幅提升效率。本文将介绍如何将Gradle构建流程集成到DevOps平台中,构建一条高效、可靠的打包流水线。以蓝鲸DevOps平台为例这是构建流水线的执行图。
2025-08-07 15:20:13
513
原创 Android singleTop启动模式开启新页面
standard(默认)singleTopsingleTask其中,singleTop如果任务栈顶的Activity是要启动的Activity,那么不会创建新的实例,而是复用该栈顶Activity,并调用其方法。否则,会正常创建新的Activity实例压入栈中。简而言之,singleTop避免了在栈顶重复创建同一个Activity实例。需求方案建议必须创建新页面实例,栈中存在多个实例修改启动模式为standard复用栈顶实例,刷新页面保持singleTop。
2025-05-24 10:42:41
1266
原创 Android中获取控件尺寸进阶方案
/ w 和 h 即为最新宽高适用于自定义控件内部。方法优缺点适用语言简单易用,单次执行精确监听,需移除监听避免内存泄漏有限场景使用自定义View的内部尺寸检测,适合自定义控件手动measure()测量提前估计尺寸获取布局参数,不一定是实际尺寸doOnLayout(KTX扩展)最简洁,自动管理监听Kotlin协程异步等待布局代码结构清晰,进阶使用Kotlin如果使用Kotlin,推荐优先试试doOnLayout,代码最简洁且安全。
2025-05-24 10:23:39
715
原创 Android native崩溃问题分析
如果是在Linux系统上,还可以通过nm命令来查看符号表。这时候需要借助堆栈翻译工具和带符号的so,找到对应堆栈。这样就比较容易定位的出问题的方法。
2025-05-16 11:20:49
529
原创 Flutter报错:Warning: CocoaPods is installed but broken
先卸载本地CocoaPods,然后重新安装。结论:CocoaPods安装有问题。这里会卡住等待,安装完成以后。
2025-04-09 20:22:28
726
原创 Firebase崩溃:DialogFragment/BottomSheetDialogFragment缺乏无参构造函数
看日志就知道是fragment恢复重建的时候,因为是系统调用了Fragment的无参构造函数导致的。可以看到,原来的代码是不包含无参构造函数的,这样就会导致重建时报错,找不到无参构造函数,因此在继承。
2025-04-07 17:25:53
248
原创 自定义人脸识别扫描控件实践
最近项目中在相册选择照片以后会首先进行人脸识别,在人脸识别过程中,为了提升用户体验,需要做一个弹窗,效果如下:于是基于ImageView实现了自定义控件,自定义控件的核心点就是绘制扫描效果和噪点。绘制扫描效果的实现方式就是,绘制一个渐变的矩形,然后让矩形移动起来,这里因为用到了,所以采用画布平移的方式来实现扫描区域上下移动,还可以采用偏移量的方式。上下移动的距离计算这边采用的是动画实现,因为要设置,实现先快后慢的效果,选择了,最后再根据动画值进行重绘。
2025-03-25 09:51:53
586
原创 Flutter运行错误:UG! exception in phase ‘semantic analysis‘
最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下:执行命令查看版本信息:通过输出信息**Java version OpenJDK Runtime Environment (build 21.0.4±12422083-b607.1)**可以知道是JDK版本不兼容问题,Flutter构建的时候默认使用了Android Studio内置的OpenJDK,最后总结了两种解决方案。通过直接修改android目录下gradle.propert
2025-03-20 14:21:41
818
原创 二维码活码-裂变营销神器
选择静态码还是活码,主要取决于需求。如果需要灵活性和后续更新,活码是更好的选择;如果只是需要传递固定信息,静态码则更为简单方便。
2025-03-20 11:00:08
488
原创 Firebase崩溃:ViewBinding not init!!
最近新版本上线以后,firebase上出现了比较多的崩溃,崩溃日志如下:页面结构是Activity中添加Fragment,Activity和Fragment都使用了ViewBinding。复现步骤是在切换系统语言以后,再回到界面调用一个方法,方法中使用了ViewBinding对象。因为切换系统语言以后,Fragment走了onDestroy和onDestroyView方法,Fragment被销毁了。Activity中是持有对应的Fragment实例的,这会出现问题。
2025-03-19 20:40:09
218
原创 Kotlin实战经验:将接口回调转换成suspend挂起函数
在 Kotlin 协程中,和是用于将回调或基于 future 的异步操作转换成挂起函数。
2025-02-10 11:56:04
842
原创 ViewPager2拦截父视图的点击事件问题排查
通过跟踪,发现是ViewPager2的子视图RecyclerView拦截了事件。ViewPager2本身是ViewGroup,首个子视图是RecyclerView,于是想到了RecyclerView的事件监听。现在要实现点击Banner执行不同的动作,于是添加了点击事件,然后在点击事件执行的时候,动态获取当前页面对应的数据,再进行处理,结果发现点击事件不生效,于是做了一番排查。最近做项目,实现横向无限视频轮播的Banner,实现方案采用的是。
2025-01-17 09:27:45
384
原创 Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace
最近需要集成Flutter作为Module,Flutter依赖了第三方库,Gradle版本是8.0。
2025-01-03 17:22:40
2206
原创 WebView缓存之锅
页面, H5页面需要登录,APP需要把登录态带过去,但是在APP端切换账号以后,还是加载的原来的H5页面,于是做了一下排查。但是还是不起作用,然后继续排查。最后发现是Cookie在切换登录账号的时候没有清掉,导致Cookie被复用了。最近做项目,需要通过。
2024-12-27 09:26:53
332
原创 Kotlin reified改造JSON解析
当调用具有reified的内联(inline)函数时,编译器必须能够知道作为类型参数传递的实际类型,以便可以修改生成的字节码以直接使用相应的类。如果使用reified T创建内联(inline)函数,则就算在运行时也可以访问 T 的类型,因此不需要另外传递 Class。在myGenericFun泛型函数体内,无法访问类型T,因为T只有在编译时可用,但在运行时就被擦除了,也就是泛型擦除,。因此,如果想在函数体中使用泛型类型作为普通类型使用,就需要显式将该类作为参数传递,如myGenericFun中所示。
2024-09-08 11:39:54
638
原创 Google Play结算防掉单方案
但是,如果缺少这一步,或者这一步失败,就会出现掉单,权益不到账问题,因此需要想办法解决。我们公司的产品主要是出海产品,使用的是Google Play支付,但是在上线以后,经常有客诉,说支付以后,权益没有到账,于是对整个Google支付体系做了研究了一下。这里有个步骤,就是在支付完了以后,Google服务会回调通知到服务端,因此只要在接收到的通知数据里面,能拿到用户ID就能进行绑定和权益发放。通过设置用户ID到这两个字段中的其中一个里面,可以在服务端收到通知的时候拿到,进行绑定,从而防止掉单情况发生。
2024-09-08 01:28:23
1630
原创 自定义控件实现类似于抖音加载动画效果
最近做AI项目,设计师想实现类似于抖音那种加载动画效果,但是不是两个圆球交叉,而是两个三角形,其实可以用lottie动画的,但是我本人比较喜欢自定义控件,因此就自定义控件实现了。思考:采用Xfermode可以实现吗。
2024-09-07 23:32:23
393
原创 自定义TextView实现结尾加载动画
最近做项目,仿豆包和机器人对话的时候,机器人返回数据是流式返回的,需要在文本结尾添加加载动画,于是自己实现了自定义TextView控件。其中BallLoadingDrawable是自定义Drawable,也可以换成其他自定义的Drawable实现不一样的动画效果。注意:使用该控件必须设置。
2024-09-07 22:54:13
581
2
原创 使用 OKHttp 实现 GPT 流式接口请求 —— 进阶实战指南
最近做项目,接入,接口是流式返回的,于是对流式接口请求做了下总结。项目中采用的实现网络请求、因为后面的标识可能会被GPT拆成两个,因此需要拼装后进行解析。
2024-09-07 12:45:56
2211
2
原创 Flutter Dio网络请求报错FormatException: Unexpected character
经过排查,发现是因为Dio默认是以JSON格式来接受数据的,因此需要更改响应数据类型。
2024-07-27 14:23:34
794
原创 Android网络安全配置network_security_config
Android开发过程中,如果出现网络请求错误,测试经常会抓包来查看请求的情况。在Android6.0 及以下系统可以抓包,而 Android7.0 及以上系统不能再抓包了,因为Android7.0及以上系统版本新增了证书验证,所以 app 内不再像原来一样默认信任用户的证书了。为了让测试能在抓包,一般都会在AndroidManifest.xml文件中配置network-security-config来实现。
2023-07-01 22:52:53
5959
原创 Android TextView自定义长按菜单
这样虽然能让TextView支持长按唤起系统菜单栏,但是如果需要定制菜单栏,该怎么做呢?在项目开发中,经常需要对TextView长按操作进行处理,弹出相应的菜单栏。只需要实现ActionMode.Callback重写其方法即可自定义菜单。要想让TextView支持长按弹出菜单栏,需要将。可以对选择的文本高亮的颜色进行更改。在styles.xml的主题中修改。可以对选择器手柄的颜色进行更改。如何自定义选择器样式呢?在TextVIew中添加。
2023-05-29 17:09:30
3127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅