- 博客(64)
- 收藏
- 关注

原创 Java进程同步
场景进程A写文件,进程B读文件,进程B需要进程A写完才能读。方案java.nio.channels.FileLock 文件锁FileLock 是进程文件锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问。每次通过FileChannel类的lock或tryLock方法获取文件锁时,都会创建一个文件锁对象。文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁(对文件加锁),要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。一旦某个进
2020-05-24 17:05:57
865

原创 从源码角度理解Handler消息机制
Handler是Android中的核心机制。通过Handler可以将Message发送到Handler所在线程对应的MessageQueue中。每一个Handler实例都只会属于唯一一个线程,也只会对应唯一一个MessageQueue。源码解析使用Handler第一步都要实例化,来看看Handler的构造函数://默认构造函数,将会使用当前线程对应的Looper,如果当前线程没有Looper则会抛出异常public Handler() { this(null, false);}//传入
2020-05-17 23:42:15
355
1
原创 Android singleTop启动模式开启新页面
standard(默认)singleTopsingleTask其中,singleTop如果任务栈顶的Activity是要启动的Activity,那么不会创建新的实例,而是复用该栈顶Activity,并调用其方法。否则,会正常创建新的Activity实例压入栈中。简而言之,singleTop避免了在栈顶重复创建同一个Activity实例。需求方案建议必须创建新页面实例,栈中存在多个实例修改启动模式为standard复用栈顶实例,刷新页面保持singleTop。
2025-05-24 10:42:41
1076
原创 Android中获取控件尺寸进阶方案
/ w 和 h 即为最新宽高适用于自定义控件内部。方法优缺点适用语言简单易用,单次执行精确监听,需移除监听避免内存泄漏有限场景使用自定义View的内部尺寸检测,适合自定义控件手动measure()测量提前估计尺寸获取布局参数,不一定是实际尺寸doOnLayout(KTX扩展)最简洁,自动管理监听Kotlin协程异步等待布局代码结构清晰,进阶使用Kotlin如果使用Kotlin,推荐优先试试doOnLayout,代码最简洁且安全。
2025-05-24 10:23:39
569
原创 Android native崩溃问题分析
如果是在Linux系统上,还可以通过nm命令来查看符号表。这时候需要借助堆栈翻译工具和带符号的so,找到对应堆栈。这样就比较容易定位的出问题的方法。
2025-05-16 11:20:49
331
原创 Flutter报错:Warning: CocoaPods is installed but broken
先卸载本地CocoaPods,然后重新安装。结论:CocoaPods安装有问题。这里会卡住等待,安装完成以后。
2025-04-09 20:22:28
364
原创 Firebase崩溃:DialogFragment/BottomSheetDialogFragment缺乏无参构造函数
看日志就知道是fragment恢复重建的时候,因为是系统调用了Fragment的无参构造函数导致的。可以看到,原来的代码是不包含无参构造函数的,这样就会导致重建时报错,找不到无参构造函数,因此在继承。
2025-04-07 17:25:53
195
原创 自定义人脸识别扫描控件实践
最近项目中在相册选择照片以后会首先进行人脸识别,在人脸识别过程中,为了提升用户体验,需要做一个弹窗,效果如下:于是基于ImageView实现了自定义控件,自定义控件的核心点就是绘制扫描效果和噪点。绘制扫描效果的实现方式就是,绘制一个渐变的矩形,然后让矩形移动起来,这里因为用到了,所以采用画布平移的方式来实现扫描区域上下移动,还可以采用偏移量的方式。上下移动的距离计算这边采用的是动画实现,因为要设置,实现先快后慢的效果,选择了,最后再根据动画值进行重绘。
2025-03-25 09:51:53
505
原创 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
527
原创 二维码活码-裂变营销神器
选择静态码还是活码,主要取决于需求。如果需要灵活性和后续更新,活码是更好的选择;如果只是需要传递固定信息,静态码则更为简单方便。
2025-03-20 11:00:08
390
原创 Firebase崩溃:ViewBinding not init!!
最近新版本上线以后,firebase上出现了比较多的崩溃,崩溃日志如下:页面结构是Activity中添加Fragment,Activity和Fragment都使用了ViewBinding。复现步骤是在切换系统语言以后,再回到界面调用一个方法,方法中使用了ViewBinding对象。因为切换系统语言以后,Fragment走了onDestroy和onDestroyView方法,Fragment被销毁了。Activity中是持有对应的Fragment实例的,这会出现问题。
2025-03-19 20:40:09
162
原创 Kotlin实战经验:将接口回调转换成suspend挂起函数
在 Kotlin 协程中,和是用于将回调或基于 future 的异步操作转换成挂起函数。
2025-02-10 11:56:04
708
原创 ViewPager2拦截父视图的点击事件问题排查
通过跟踪,发现是ViewPager2的子视图RecyclerView拦截了事件。ViewPager2本身是ViewGroup,首个子视图是RecyclerView,于是想到了RecyclerView的事件监听。现在要实现点击Banner执行不同的动作,于是添加了点击事件,然后在点击事件执行的时候,动态获取当前页面对应的数据,再进行处理,结果发现点击事件不生效,于是做了一番排查。最近做项目,实现横向无限视频轮播的Banner,实现方案采用的是。
2025-01-17 09:27:45
252
原创 Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace
最近需要集成Flutter作为Module,Flutter依赖了第三方库,Gradle版本是8.0。
2025-01-03 17:22:40
1475
原创 WebView缓存之锅
页面, H5页面需要登录,APP需要把登录态带过去,但是在APP端切换账号以后,还是加载的原来的H5页面,于是做了一下排查。但是还是不起作用,然后继续排查。最后发现是Cookie在切换登录账号的时候没有清掉,导致Cookie被复用了。最近做项目,需要通过。
2024-12-27 09:26:53
277
原创 Kotlin reified改造JSON解析
当调用具有reified的内联(inline)函数时,编译器必须能够知道作为类型参数传递的实际类型,以便可以修改生成的字节码以直接使用相应的类。如果使用reified T创建内联(inline)函数,则就算在运行时也可以访问 T 的类型,因此不需要另外传递 Class。在myGenericFun泛型函数体内,无法访问类型T,因为T只有在编译时可用,但在运行时就被擦除了,也就是泛型擦除,。因此,如果想在函数体中使用泛型类型作为普通类型使用,就需要显式将该类作为参数传递,如myGenericFun中所示。
2024-09-08 11:39:54
599
原创 Google Play结算防掉单方案
但是,如果缺少这一步,或者这一步失败,就会出现掉单,权益不到账问题,因此需要想办法解决。我们公司的产品主要是出海产品,使用的是Google Play支付,但是在上线以后,经常有客诉,说支付以后,权益没有到账,于是对整个Google支付体系做了研究了一下。这里有个步骤,就是在支付完了以后,Google服务会回调通知到服务端,因此只要在接收到的通知数据里面,能拿到用户ID就能进行绑定和权益发放。通过设置用户ID到这两个字段中的其中一个里面,可以在服务端收到通知的时候拿到,进行绑定,从而防止掉单情况发生。
2024-09-08 01:28:23
1459
原创 自定义控件实现类似于抖音加载动画效果
最近做AI项目,设计师想实现类似于抖音那种加载动画效果,但是不是两个圆球交叉,而是两个三角形,其实可以用lottie动画的,但是我本人比较喜欢自定义控件,因此就自定义控件实现了。思考:采用Xfermode可以实现吗。
2024-09-07 23:32:23
345
原创 自定义TextView实现结尾加载动画
最近做项目,仿豆包和机器人对话的时候,机器人返回数据是流式返回的,需要在文本结尾添加加载动画,于是自己实现了自定义TextView控件。其中BallLoadingDrawable是自定义Drawable,也可以换成其他自定义的Drawable实现不一样的动画效果。注意:使用该控件必须设置。
2024-09-07 22:54:13
485
2
原创 使用 OKHttp 实现 GPT 流式接口请求 —— 进阶实战指南
最近做项目,接入,接口是流式返回的,于是对流式接口请求做了下总结。项目中采用的实现网络请求、因为后面的标识可能会被GPT拆成两个,因此需要拼装后进行解析。
2024-09-07 12:45:56
1708
2
原创 Flutter Dio网络请求报错FormatException: Unexpected character
经过排查,发现是因为Dio默认是以JSON格式来接受数据的,因此需要更改响应数据类型。
2024-07-27 14:23:34
581
原创 Android网络安全配置network_security_config
Android开发过程中,如果出现网络请求错误,测试经常会抓包来查看请求的情况。在Android6.0 及以下系统可以抓包,而 Android7.0 及以上系统不能再抓包了,因为Android7.0及以上系统版本新增了证书验证,所以 app 内不再像原来一样默认信任用户的证书了。为了让测试能在抓包,一般都会在AndroidManifest.xml文件中配置network-security-config来实现。
2023-07-01 22:52:53
5086
原创 Android TextView自定义长按菜单
这样虽然能让TextView支持长按唤起系统菜单栏,但是如果需要定制菜单栏,该怎么做呢?在项目开发中,经常需要对TextView长按操作进行处理,弹出相应的菜单栏。只需要实现ActionMode.Callback重写其方法即可自定义菜单。要想让TextView支持长按弹出菜单栏,需要将。可以对选择的文本高亮的颜色进行更改。在styles.xml的主题中修改。可以对选择器手柄的颜色进行更改。如何自定义选择器样式呢?在TextVIew中添加。
2023-05-29 17:09:30
2681
原创 Android媒体库不刷新问题追溯和解决
最近项目中需要通过ContentProvider获取某种类型的文件列表进行展示,然后在展示列表中可以对文件进行复制,移动和删除操作。在开发过程中,对文件操作以后,再次拉取列表,发现还是原来的旧数据,数据并没有刷新,于是做了一下追溯和解决。查询文件ContentProvider private List<File> findFile(Context context, List<String> extensions) { String[] mineTypes
2022-05-14 20:02:57
1338
原创 组件化:合并清单文件
最近做项目,在集成第三方aar以后,本来请求读写权限允许以后应该是权限授予成功了,但是结果却是读权限授予成功了,但是写权限未授权。主项目清单文件权限声明如下:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />然后通过Andr
2022-05-01 21:42:19
815
原创 Navigation重建Fragment问题分析及解决
最近项目中使用到了BottomNavigationView结合Navigation实现底部导航栏切换页面业务。NavigationUI.setupWithNavController(bottomNavigationView, navController);结果发现每次点击底部导航栏切换的时候都会重建Fragment,于是分析了源码,并研究了解决方案。源码分析setupWithNavControllerNavigation源码分析解决方案自定义Navigator...
2022-05-01 18:35:16
3852
15
原创 EditText选中全部无效问题排查
最近项目有需求,EditText第一次获取焦点以后弹出软键盘并且选中所有文本,于是想到将android:selectAllOnFocus设置为true就能实现。<androidx.appcompat.widget.AppCompatEditText android:layout_width="match_parent" android:layout_height="50dp" android:maxLines="1" android:s
2022-04-17 22:57:21
2689
原创 Intent.ACTION_VIEW无法跳转问题排查
项目中文本链接(包括网址和邮箱)点击以后使用的是Intent.ACTION_VIEW打开,但是有用户反馈在三星Galaxy Tab S7上点击以后无法跳转,于是做了问题的排查,最后确定为Android 11以上软件包可见性未设置。链接点击跳转代码如下: public static void openBrowser(Context context, String url) { final Intent intent = new Intent(Intent.ACTION_VIEW, U
2022-04-09 14:48:08
6208
2
原创 Android底部弹窗实现方案
项目中经常会遇到底部弹窗,今天就来把底部弹窗实现方案总结一下。BottomSheetDialog自定义DialogWindowManager
2022-03-20 12:22:26
8836
1
原创 顺序显示多个弹窗方案-责任链模式
在应用中,用户进入应用首页以后经常会遇到顺序弹出多个弹窗的业务。例如进入首页以后,首先弹出运营活动弹窗,然后弹出应用评分或反馈弹窗,最后弹出应用更新弹窗等等。于是想到封装一套代码可以控制弹窗流程执行。DialogChainOwner弹窗链持有者。负责弹窗链节点的加入和展示入口。/** * 弹窗链拥有者,用于控制链节点的添加和展示以及取消,销毁 */public class DialogChainOwner implements LifecycleEventObserver { priv
2022-03-19 22:20:00
1534
1
原创 Java Comparable与Comparator的区别
Java 提供了两个接口来使用类的数据成员对对象进行排序:Comparable和Comparator。Comparable一个Comparable对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable接口来比较它的实例。考虑一个Movie类,它的成员喜欢、评级、名称、年份。假设希望根据发行年份对电影列表进行排序。可以用Movie类实现Comparable接口,重写Comparable接口的compareTo()方法。 class Movie implemen
2022-01-16 14:22:36
1596
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人