自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于coroutine的异常捕获和取消机制

如果我们在launch外面try catch 意图捕获异常的话如果不是在抛出异常的地方直接捕获异常,那么在外面是捕获不到的,会直接导致应用奔溃。

2024-10-15 12:29:37 1099

原创 flow 终极系列

collectLatest不会等待下游把事件处理完,而是继续发送,当下游收到新的事件后,会中止前面一个事件的处理,所以,我们只有看到,最后一个事件被处理完成,其他的都是知识开始,就中止了。普通的flow没有一个缓冲区,所以只能等前面的数据处理完之后,再发送下一个,但是如果我们给他加一个缓冲区buffer,这样,上游数据的发送不受下游处理速度的影响。会确保处理顺序,只有当前的流全部处理完毕后,才会继续处理下一个流,这点和。上游又发送了5,处理后变成6发送出去了,前一个的1变成3刚完成,发送了3。

2024-10-10 08:00:00 2870

原创 如何定义android compose屏保程序

摘要:本文介绍了如何使用Jetpack Compose创建Android屏保程序。核心是继承DreamService类,通过ComposeView实现屏保UI。主要步骤包括:1)在AndroidManifest中声明DreamService;2)实现LifecycleOwner等接口管理生命周期;3)在onAttachedToWindow()中设置ComposeView;4)使用Composable函数ScreenSaverContent()显示漂浮时钟效果。该时钟会每秒更新时间,并在屏幕上随机移动位置,动

2025-11-12 09:34:23 330

原创 mmkv版本兼容

【摘要】MMKV升级到2.0时,64位设备需满足Google Play的16KB页大小要求,但会导致32位设备崩溃。解决方案是通过ABI分包实现多版本兼容:在build.gradle中配置armeabi-v7a使用MMKV1.3.x(32位),arm64-v8a使用MMKV2.x(64位)。通过productFlavors为不同架构分别打包,生成两个APK/AAB文件,既满足政策要求又兼容旧设备。具体实现包括:开启ABI拆分、设置flavorDimensions、差异化依赖版本,最终通过assemble命令

2025-09-22 09:00:11 431

原创 拖拽移动并监听点击事件

【代码】拖拽移动并监听点击事件。

2025-09-17 13:17:43 121

原创 在android应用中执行su命令

本文介绍了两种在已root设备上执行su命令的方法:1)通过executeProcess函数直接执行命令数组,如listOf("su","0","id");2)通过execSu548Command函数实现交互式命令执行,先获取su权限再写入命令并读取输出。两种方法都包含异常处理和进程清理,后者还支持命令链式执行。代码示例展示了如何实现命令执行、输出捕获和日志记录功能。

2025-09-12 15:04:02 246

原创 如何监听 mutableStateListOf 的变化

然后呢,在UI compose部分,希望通过launcher 来监听tabState的内容,触发界面变化之类的。然后比如在网络请求等数据更新后,对这个 tabState进行内容更新,例如。看到别人写的一个compose的代码,作为初学很容易犯的一个错;} //需要监听 tabstate list。在viewmodel中定义个列表变量。由于列表实例不变,所以不会重新执行。​(添加/删除/修改元素)时,​。用来存储tablist,所以在compose部分。不检查列表内容的实际变化。

2025-09-09 15:33:59 221

原创 低端设备加载webp ANR

这篇ANR日志分析显示,应用在欢迎页加载一张分辨率过高的WebP图片(5760x3240,57.47KB)导致了ANR问题。通过Google官方WebP工具对图片进行优化,使用参数"-q75 -resize 2880x1620"将尺寸缩小50%后,图片质量保持良好(PSNR 56.26dB)且文件体积显著减小(19.8KB)。优化后的图片在显示效果无差异的情况下,有效解决了因解码超大分辨率图片导致的ANR问题。建议对应用中的大尺寸图片资源进行类似优化处理。

2025-08-18 13:56:18 180

原创 Arouter框架暴露api接口给其他模块

文章摘要: 本文介绍了基于ARouter的模块化通信实现方案。1.在公共模块定义接口SunnyDeviceApi和数据类SportData;2.在设备模块实现接口并注册路由;3.通过懒加载方式在公共模块封装路由获取逻辑;4.其他模块只需依赖公共模块即可调用设备功能。该方案实现了模块间解耦,通过接口标准化通信,利用ARouter实现跨模块服务调用,避免了直接依赖。典型应用包括初始化、注册/注销监听器等设备操作。

2025-07-24 15:57:45 187

原创 compose LazyListState

摘要:rememberLazyListState是Jetpack Compose中管理LazyColumn/LazyRow滚动状态的关键工具。它提供两种主要功能:1)精确控制滚动位置,如通过scrollToItem()方法将列表定位到指定项;2)实时监听滚动位置变化,当用户滚动到列表末尾附近时自动触发加载更多数据(如检测到倒数第3项时调用loadMoreStatistic)。该状态对象还支持反向布局(reverseLayout)等配置,是构建高效、响应式列表组件的核心API。

2025-07-03 13:23:49 275

原创 自定义上下两个方向的柱形图

用compose绘制一个自定义的柱形图标,上面表示一个列表值,下方表示另外一个列表值。

2025-06-28 16:34:20 254

原创 关于Arouter的初始化

摘要:ARouter初始化在主线程执行时,开启debug模式(ARouter.openDebug())会触发Dex文件加载,导致低端设备上耗时近10秒。若未使用自动注册工具(如arouter-register或JailedBird.ARouterPlugin),可通过配置arouter_config{disableTransformWhenDebugBuild=true}避免debug阶段插桩,提升编译速度,但路由变更需清除应用数据生效。该方案牺牲首次启动性能(依赖原生Dex遍历)换取编译效率,适合大型项

2025-06-18 10:04:50 283

原创 依赖冲突了移除

导入依赖库的时候,依赖库里面有依赖不同的版本,造成冲突,可以通过。之类的把合并冲突的移除。

2025-06-18 09:44:07 120

原创 firebase异常捕获

data/user/0/com.xxxxx/files/.crashlytics. 下有文件。在代码中主动 throw RuntimeException(),但是控制台始终无法看到日志,配置 google-service.json。如何开启调试和查看日志呢?依赖,plugin等。

2025-06-12 15:33:57 300

原创 compose 保持屏幕常亮的工具类

利用view的 keepScreenOn属性,通过监听compose的resume和pause来给视图添加常亮。在需要常亮的地方通过。就可以添加界面常亮了。

2025-06-07 10:19:21 232

原创 apk图片资源优化,减小APK大小

png, svg转矢量图,webp到底用什么格式的图片呢?在Android开发中选择图片资源格式(PNG、SVG、WebP)需综合考虑​​。

2025-06-05 10:41:49 402

原创 内存泄漏修复示例

集成LeakCanary工具后,开发者可以检测并修复Android应用中的内存泄漏问题。LeakCanary通过弹窗提示内存泄漏,并生成详细的泄漏日志,帮助开发者定位问题。本文列举了1.0版本中检测并修复的多个内存泄漏示例,包括非静态内部类持有外部类引用、匿名内部类隐式持有Fragment引用、静态变量持有Fragment引用、服务广播未解绑、播放器SubtitleView未释放以及Handler未取消消息等。针对这些问题,提出了相应的修复方案,如将内部类改为静态类并使用弱引用、在Fragment销毁时断开

2025-05-22 11:50:41 720

原创 rememberLauncherForActivityResult使用示例

需求需要跳转到 CoursexxxActivity ,选择课程,选中课程后,会将课程对象放到返回的intent中。需要先定义ManagedActivityResultLauncher。那么如何启动这个Activity,并且获取返回的课程内容内。然后在需要启动跳转的时候。怎么启动intent呢。

2025-05-08 09:01:56 334

原创 AsyncImage 无法加载图片排查

排查到 原来的Activity 页面有如下代码。建议把这段代码移到 oncreate中,在非UI线程用的getresource。添加 onError = {修改之后,图片正常加载。

2025-05-06 09:21:23 348

原创 多个请求并行改造

有时候recompose次数没必要优化,除非真的影响到性能了。compose 页面的recompose次数。

2025-04-26 21:06:55 177

原创 compose 二维码扫描qrcode

【代码】compose 二维码扫描qrcode。

2025-04-26 15:51:47 260

原创 fragment 异常 InstantiationException

BadgeListInfoDialog有了有参数的构造函数,就没有了默认的无参构造函数。接手的项目过了下firebase和内存泄漏,还是有很多常见共性的问题。如果自定义了带参数的构造函数,系统无法找到无参构造方法,直接崩溃。这个异常也是非常常见,但是很多人不会去修复的。传递参数是 Android 的官方推荐做法。所以比如页面销毁重建的时候,就会报这个异常。在oncreate中。

2025-04-19 17:07:24 382

原创 关于viewpager常见的泄漏

但是这样比如在 mainfragment就就强引用了子fragment,这种强应用leakcanary不会报异常,但是Android studio的profile会报泄漏。在一个页面中 如果有用到tab,有需要进行fragment的切换,经常就看到了。这样就可以不直接引用fragment。

2025-04-19 16:29:40 271

原创 根据Exif信息纠正图片方向

throw IOException("无法解码图片: $originalPath")// 保存旋转后的图片,并重置 Exif 方向为正常。else -> 0f // 无需旋转。// 如果方向正常,直接返回原图路径。// 创建临时文件保存旋转后的图片。/ 工具函数:纠正图片方向并保存到新文件。// 读取原图的 Exif 方向。// 回收 Bitmap 内存。

2025-04-19 16:15:00 443

原创 上传文件worker

大文件在上传时如果全部加载进内存,容易造成 OOM(Out of Memory)。:网络中断时,如果是整个文件上传,一旦失败就要重头再来,耗时耗流量。:可以做断点续传、上传进度监控、更好地用户体验。如果文件很大,大到一个什么范围需要分段上传呢?:需要视设备内存情况和网络稳定性决定。:推荐强烈使用分段上传。:直接上传通常没问题。

2025-04-12 18:19:42 197

原创 通过uri获取文件路径手机适配

其实有的手机通过选择图片或者文件后返回的uri并不一定是媒体uri,也可能是document uri,造成这个时候直接通过 uri查询,找不到_data字段,需要将 document uri中分离出类型和id,在拼凑成新的uri,在通过contentprovider查询,才可以查出 _data字段中真正的路径。但是根据文档其实Android 10 之后是有新的字段,但是手机厂商众多,实现方式不一,还是找不到path怎么办,官方是说可以从 RELATIVE_PATH获取路径。

2025-04-12 17:39:01 755

原创 关于遗留项目重构反复看

如果一定要集成一个基类,比如实在不想每个fragment都添加方法,可以讲这个base写成具体的功能,不过Philip还是很拒绝使用继承来实现这些~~~~2. 关于一些可能的公共功能,将功能从viewmodel中抽离出来,并且用interface的方式来引用,通过依赖注入来初始化,便于测试。可能不太有必要,一些公用的方法可以通过ext扩展函数来实现。1. 关于 base fragment 的必要性?3.有些很好的flow的方式,可惜没有源码贴不出来。这个关于遗留项目的重构视频可以反复看。

2025-03-30 11:07:22 357

原创 关于application的persistent属性

从 Android 5.0(API 21)开始,Google 已不再允许普通应用使用 android:persistent="true",这个标志 仅适用于系统级应用(如 SystemUI、Telephony)。该属性用于指定 应用是否应该在系统启动时持久运行。如果设置为 true,Android 会尝试在设备启动时保留该应用,并尽可能不杀死它,即使系统内存紧张。作为系统应用,如果有persistent属性,则有可能无法重装,卸载等。之前的应用用了这个属性,且正好又是系统APP,

2025-03-29 14:15:10 403

原创 修改apk 文件名 kts写法

0 // 确保是 Int 类型。// 过滤掉文件名中的非法字符。

2025-03-24 09:45:01 411

原创 compose 进度环

【代码】compose 进度环。

2025-03-23 14:04:08 206

原创 Android获取U盘路径

2. 通过storemanager获取usb 路径。

2025-03-23 13:56:09 831

原创 AlarmManager添加定时任务

通过AlarmManager添加定时任务,即使应用被杀死了,也会启动intent。用户静默安装前,定时自启动自身应用。直到应用启动完成,取消其他的定时任务。

2025-03-16 19:37:16 282

原创 android 后台下载任务,断点续传

Android后台任务下载文件

2025-03-16 19:32:07 543

原创 Android studio取消代理

所以当取消代理的时候,只是将设置中的代理取消勾选,可视同步代码的时候,一直报org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:7890。Windows :C:\Users\Administrator.gradle下的gradle.properties中。Mac :/Users/.{用户目录}/.gradle下的gradle.properties中。以下为不同客户端下gradle.properties文件所在的目录。

2025-02-25 15:27:50 647

原创 旧项目内存泄漏修复

有个旧项目内存泄漏问题,用的是viewpager,页面多次跳转后,内存明显一直在增长,最后发现是viewpager中对fragment的引用导致。所以需要对adapter进行改造,不直接引用fragment,而是fragment的class。改造之后,页面跳转内存就平稳了。

2025-01-09 10:26:21 232

原创 动不动就要收费,pdf拆分python脚本

一些资料要拆分,现在编辑器,pdf拆分都要钱,,,这里三分钟ai帮你写一个pdf拆分脚本。

2024-11-29 14:37:25 290

原创 采用koin 依赖注入进行viewmodel单元测试

桌面开发的viewmodel 和Android的viewmodel 创建方式不一样,Android有屏幕旋转,生命周期等感知。这样就可以通过注入的方式初始化viewmode。测试class要继承 KoinTest。在测试开始时,对koin进行初始化。

2024-11-12 19:04:11 803

原创 compose 桌面开发中如何使用KOIN依赖注入

在composable中使用viewmodel。在main.kt中初始化koin。写法和Android略有不同。其中module定义。

2024-11-11 17:55:28 392

原创 在多模块应用中使用navigation不知不觉都是这么用

核心common模块定义了Route1->screen1,Route2->screen2,Route3->screen3.....如果我现在单独使用 featureB,但是featureB中因为导航的这个逻辑,又要不得不去关联featureA。假设我们有主模块 app, 功能模块 featureA, featureB,所以,我们不该在内部的功能部分看到navigate的导航逻辑。所以,需要把导航的逻辑到需要通过lambda来提升到外部去。我们把导航逻辑写到模块中带来的问题是,

2024-11-01 09:12:19 222

原创 compose.material3 中的DatePicker在 desktop 平台同样可以适用

【代码】compose.material3 中的DatePicker在 desktop 平台同样可以适用。

2024-10-30 14:11:07 313

用于Excel下载测试

用于Excel下载测试

2024-11-06

空空如也

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

TA关注的人

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