自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

折翅鵬的博客

虽已折断翅膀,依然渴望飞翔。

  • 博客(68)
  • 收藏
  • 关注

原创 Java进程同步

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

2020-05-24 17:05:57 875

原创 从源码角度理解Handler消息机制

Handler是Android中的核心机制。通过Handler可以将Message发送到Handler所在线程对应的MessageQueue中。每一个Handler实例都只会属于唯一一个线程,也只会对应唯一一个MessageQueue。源码解析使用Handler第一步都要实例化,来看看Handler的构造函数://默认构造函数,将会使用当前线程对应的Looper,如果当前线程没有Looper则会抛出异常public Handler() { this(null, false);}//传入

2020-05-17 23:42:15 367 1

原创 自定义ViewPage2滑动切换效果

默认效果虽然简洁,但往往不能满足个性化需求。轮播图:滑动时缩放,突出中间页面,弱化两侧页面;阅读器/相册:左右切换时淡入淡出,避免突兀感;卡片浏览:滑动时叠加旋转,增强层次感。这些效果都可以通过 ViewPager2 的 PageTransformer 接口 来实现。页面越靠近中心,缩放比例越大,透明度越高;侧边页面缩小并半透明,突出中间页面。

2025-08-18 17:27:19 692

原创 Android 流式布局实现方案全解析

在日常 Android 开发中,经常会遇到 流式布局 (Flow Layout) 的需求,比如:所谓“流式布局”,就是子 View 按行排列,如果一行放不下,就自动换行,类似于 HTML/CSS 的 flex-wrap: wrap 效果。那么在 Android 中,如何实现流式布局呢?Google 官方开源的 FlexboxLayout 是实现流式布局的首选,它模仿了 CSS 的 Flexbox,支持换行、对齐、弹性伸缩等特性。引入依赖:对应的仓库地址:动态添加✅ 优点:官方维护,功能完善,属性和

2025-08-18 10:07:22 453

原创 RecyclerView 拖拽与滑动操作

重写 onSelectedChanged() 和 clearView() 来在拖拽开始与结束时修改选中项的视觉(如背景色变更等)配合 ItemAnimator 可实现平滑位移动画= null) :): Int {// 支持向上向下拖拽,向左滑动val swipeFlags = ItemTouchHelper.START // 或 END= null。

2025-08-14 21:53:25 735

原创 DevOps平台结合Gradle实现打包流水线

在现代软件开发中,持续集成与持续交付(CI/CD)已成为团队提速、降本增效的核心实践。Gradle作为强大的自动化构建工具,常被用于Android与Java项目的构建打包任务。而将Gradle集成进企业的DevOps平台中,不仅可以标准化构建过程,还能自动化打包、测试、发布的全流程,大幅提升效率。本文将介绍如何将Gradle构建流程集成到DevOps平台中,构建一条高效、可靠的打包流水线。以蓝鲸DevOps平台为例这是构建流水线的执行图。

2025-08-07 15:20:13 413

原创 Android singleTop启动模式开启新页面

standard(默认)singleTopsingleTask其中,singleTop如果任务栈顶的Activity是要启动的Activity,那么不会创建新的实例,而是复用该栈顶Activity,并调用其方法。否则,会正常创建新的Activity实例压入栈中。简而言之,singleTop避免了在栈顶重复创建同一个Activity实例。需求方案建议必须创建新页面实例,栈中存在多个实例修改启动模式为standard复用栈顶实例,刷新页面保持singleTop。

2025-05-24 10:42:41 1149

原创 Android中获取控件尺寸进阶方案

/ w 和 h 即为最新宽高适用于自定义控件内部。方法优缺点适用语言简单易用,单次执行精确监听,需移除监听避免内存泄漏有限场景使用自定义View的内部尺寸检测,适合自定义控件手动measure()测量提前估计尺寸获取布局参数,不一定是实际尺寸doOnLayout(KTX扩展)最简洁,自动管理监听Kotlin协程异步等待布局代码结构清晰,进阶使用Kotlin如果使用Kotlin,推荐优先试试doOnLayout,代码最简洁且安全。

2025-05-24 10:23:39 617

原创 Gradle导入旧工程报错问题解决

重新build一下就好了。

2025-05-21 11:25:18 359

原创 Android native崩溃问题分析

如果是在Linux系统上,还可以通过nm命令来查看符号表。这时候需要借助堆栈翻译工具和带符号的so,找到对应堆栈。这样就比较容易定位的出问题的方法。

2025-05-16 11:20:49 416

原创 Flutter报错:Warning: CocoaPods is installed but broken

先卸载本地CocoaPods,然后重新安装。结论:CocoaPods安装有问题。这里会卡住等待,安装完成以后。

2025-04-09 20:22:28 436

原创 Firebase崩溃:DialogFragment/BottomSheetDialogFragment缺乏无参构造函数

看日志就知道是fragment恢复重建的时候,因为是系统调用了Fragment的无参构造函数导致的。可以看到,原来的代码是不包含无参构造函数的,这样就会导致重建时报错,找不到无参构造函数,因此在继承。

2025-04-07 17:25:53 213

原创 自定义人脸识别扫描控件实践

最近项目中在相册选择照片以后会首先进行人脸识别,在人脸识别过程中,为了提升用户体验,需要做一个弹窗,效果如下:于是基于ImageView实现了自定义控件,自定义控件的核心点就是绘制扫描效果和噪点。绘制扫描效果的实现方式就是,绘制一个渐变的矩形,然后让矩形移动起来,这里因为用到了,所以采用画布平移的方式来实现扫描区域上下移动,还可以采用偏移量的方式。上下移动的距离计算这边采用的是动画实现,因为要设置,实现先快后慢的效果,选择了,最后再根据动画值进行重绘。

2025-03-25 09:51:53 522

原创 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 586

原创 二维码活码-裂变营销神器

选择静态码还是活码,主要取决于需求。如果需要灵活性和后续更新,活码是更好的选择;如果只是需要传递固定信息,静态码则更为简单方便。

2025-03-20 11:00:08 424

原创 Firebase崩溃:ViewBinding not init!!

最近新版本上线以后,firebase上出现了比较多的崩溃,崩溃日志如下:页面结构是Activity中添加Fragment,Activity和Fragment都使用了ViewBinding。复现步骤是在切换系统语言以后,再回到界面调用一个方法,方法中使用了ViewBinding对象。因为切换系统语言以后,Fragment走了onDestroy和onDestroyView方法,Fragment被销毁了。Activity中是持有对应的Fragment实例的,这会出现问题。

2025-03-19 20:40:09 178

原创 基于Kotlin中Flow扩展重试方法

最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。Flow提供了和。

2025-02-10 15:14:36 803

原创 Kotlin实战经验:将接口回调转换成suspend挂起函数

在 Kotlin 协程中,和是用于将回调或基于 future 的异步操作转换成挂起函数。

2025-02-10 11:56:04 735

原创 ViewPager2拦截父视图的点击事件问题排查

通过跟踪,发现是ViewPager2的子视图RecyclerView拦截了事件。ViewPager2本身是ViewGroup,首个子视图是RecyclerView,于是想到了RecyclerView的事件监听。现在要实现点击Banner执行不同的动作,于是添加了点击事件,然后在点击事件执行的时候,动态获取当前页面对应的数据,再进行处理,结果发现点击事件不生效,于是做了一番排查。最近做项目,实现横向无限视频轮播的Banner,实现方案采用的是。

2025-01-17 09:27:45 306

原创 Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module,Flutter依赖了第三方库,Gradle版本是8.0。

2025-01-03 17:22:40 1774

原创 WebView缓存之锅

页面, H5页面需要登录,APP需要把登录态带过去,但是在APP端切换账号以后,还是加载的原来的H5页面,于是做了一下排查。但是还是不起作用,然后继续排查。最后发现是Cookie在切换登录账号的时候没有清掉,导致Cookie被复用了。最近做项目,需要通过。

2024-12-27 09:26:53 294

原创 Kotlin reified改造JSON解析

当调用具有reified的内联(inline)函数时,编译器必须能够知道作为类型参数传递的实际类型,以便可以修改生成的字节码以直接使用相应的类。如果使用reified T创建内联(inline)函数,则就算在运行时也可以访问 T 的类型,因此不需要另外传递 Class。在myGenericFun泛型函数体内,无法访问类型T,因为T只有在编译时可用,但在运行时就被擦除了,也就是泛型擦除,。因此,如果想在函数体中使用泛型类型作为普通类型使用,就需要显式将该类作为参数传递,如myGenericFun中所示。

2024-09-08 11:39:54 609

原创 Google Play结算防掉单方案

但是,如果缺少这一步,或者这一步失败,就会出现掉单,权益不到账问题,因此需要想办法解决。我们公司的产品主要是出海产品,使用的是Google Play支付,但是在上线以后,经常有客诉,说支付以后,权益没有到账,于是对整个Google支付体系做了研究了一下。这里有个步骤,就是在支付完了以后,Google服务会回调通知到服务端,因此只要在接收到的通知数据里面,能拿到用户ID就能进行绑定和权益发放。通过设置用户ID到这两个字段中的其中一个里面,可以在服务端收到通知的时候拿到,进行绑定,从而防止掉单情况发生。

2024-09-08 01:28:23 1492

原创 自定义控件实现类似于抖音加载动画效果

最近做AI项目,设计师想实现类似于抖音那种加载动画效果,但是不是两个圆球交叉,而是两个三角形,其实可以用lottie动画的,但是我本人比较喜欢自定义控件,因此就自定义控件实现了。思考:采用Xfermode可以实现吗。

2024-09-07 23:32:23 358

原创 自定义TextView实现结尾加载动画

最近做项目,仿豆包和机器人对话的时候,机器人返回数据是流式返回的,需要在文本结尾添加加载动画,于是自己实现了自定义TextView控件。其中BallLoadingDrawable是自定义Drawable,也可以换成其他自定义的Drawable实现不一样的动画效果。注意:使用该控件必须设置。

2024-09-07 22:54:13 520 2

原创 使用 OKHttp 实现 GPT 流式接口请求 —— 进阶实战指南

最近做项目,接入,接口是流式返回的,于是对流式接口请求做了下总结。项目中采用的实现网络请求、因为后面的标识可能会被GPT拆成两个,因此需要拼装后进行解析。

2024-09-07 12:45:56 1955 2

原创 Flutter Dio网络请求报错FormatException: Unexpected character

经过排查,发现是因为Dio默认是以JSON格式来接受数据的,因此需要更改响应数据类型。

2024-07-27 14:23:34 638

原创 基于NDK验签的方式实现APP重签名校验方案

最近发现有人破解我们的应用,于是研究了一下如何在应用被破解以后,让应用退出的简单实现方案。

2023-12-04 16:21:29 579

原创 Android设置文字颜色渐变

项目中用到了很多文字颜色渐变的设计,因此做一下记录。属性颜色值,否则不会产生预期效果。

2023-11-29 11:35:57 1641

原创 Android网络安全配置network_security_config

Android开发过程中,如果出现网络请求错误,测试经常会抓包来查看请求的情况。在Android6.0 及以下系统可以抓包,而 Android7.0 及以上系统不能再抓包了,因为Android7.0及以上系统版本新增了证书验证,所以 app 内不再像原来一样默认信任用户的证书了。为了让测试能在抓包,一般都会在AndroidManifest.xml文件中配置network-security-config来实现。

2023-07-01 22:52:53 5416

原创 Android TextView自定义长按菜单

这样虽然能让TextView支持长按唤起系统菜单栏,但是如果需要定制菜单栏,该怎么做呢?在项目开发中,经常需要对TextView长按操作进行处理,弹出相应的菜单栏。只需要实现ActionMode.Callback重写其方法即可自定义菜单。要想让TextView支持长按弹出菜单栏,需要将。可以对选择的文本高亮的颜色进行更改。在styles.xml的主题中修改。可以对选择器手柄的颜色进行更改。如何自定义选择器样式呢?在TextVIew中添加。

2023-05-29 17:09:30 2824

原创 判断点在任意矩形内

Path反旋转向量乘积

2023-05-13 14:10:06 766

原创 基于顶部对齐进行裁剪的ImageView

最近项目中需要基于顶部对齐,然后对图片进行缩放裁剪的效果,于是就研究了一下,整理代码如下。

2023-04-20 09:54:04 717

原创 Android媒体库不刷新问题追溯和解决

最近项目中需要通过ContentProvider获取某种类型的文件列表进行展示,然后在展示列表中可以对文件进行复制,移动和删除操作。在开发过程中,对文件操作以后,再次拉取列表,发现还是原来的旧数据,数据并没有刷新,于是做了一下追溯和解决。查询文件ContentProvider private List<File> findFile(Context context, List<String> extensions) { String[] mineTypes

2022-05-14 20:02:57 1358

原创 组件化:合并清单文件

最近做项目,在集成第三方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 858

原创 Navigation重建Fragment问题分析及解决

最近项目中使用到了BottomNavigationView结合Navigation实现底部导航栏切换页面业务。NavigationUI.setupWithNavController(bottomNavigationView, navController);结果发现每次点击底部导航栏切换的时候都会重建Fragment,于是分析了源码,并研究了解决方案。源码分析setupWithNavControllerNavigation源码分析解决方案自定义Navigator...

2022-05-01 18:35:16 3915 15

原创 完整Activity和Fragment生命周期

参考:https://github.com/xxv/android-lifecycle

2022-04-23 22:53:34 353

原创 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 2711

原创 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 6258 2

原创 Android底部弹窗实现方案

项目中经常会遇到底部弹窗,今天就来把底部弹窗实现方案总结一下。BottomSheetDialog自定义DialogWindowManager

2022-03-20 12:22:26 8860 1

空空如也

空空如也

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

TA关注的人

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