- 博客(16)
- 收藏
- 关注
原创 多模块架构下的依赖治理:如何避免 Gradle 依赖地狱
依赖治理不仅仅是为了“编译通过”,更是为了项目的长治久安。标准化:全线迁移到。隔离化:严控api使用,默认为。一致化:善用BOM和解决版本冲突。自动化:定期用插件扫描“僵尸依赖”。把这些做好了,你会发现你的 Android 项目就像打理好的花园一样,清爽、稳定、构建飞快。
2026-02-08 21:30:00
699
原创 Android RecyclerView 性能优化
优化 RecyclerView 其实就是一场与 16ms(60fps)的赛跑。逻辑层面:用DiffUtil替代全量刷新。代码层面onBind越轻越好。布局层面:减少层级,共用 Pool。配置层面,调整 Cache。把这几点做到位,你的列表绝对能从“拖拉机”变成“磁悬浮”。
2026-02-07 10:30:00
1044
原创 Gradle 编译太慢?我是如何把构建时间从 5 分钟优化到 40 秒的
基础配置:并行、缓存、大内存。核心替换黑科技减负:Debug 模式剔除无用 Task。我的项目从冷启动 5 分钟变成了 40 秒左右,热启动(改几行代码)通常在 5-8 秒内完成。这种流畅感,真的会让你爱上写代码(起码不讨厌按 Run 了)。如果你也被 Gradle 折磨,不妨今晚就试试这几招。P.S. 如果以上都没用,可能你真的需要换一台 M 芯片的 Mac 了……(逃)
2026-02-06 19:15:00
1011
原创 inline、noinline 与 crossinline:从字节码层面看高阶函数的性能开销与控制流限制
绝大多数时候:高阶函数请无脑用inline。特别是那些只执行一次、立即执行的工具函数(如letapplyforEach如果参数需要被存储/传递:该参数必须用noinline。如果参数在内部类/线程中执行:为了防止调用者写出非法的return炸掉栈帧,必须用。inline是用空间换时间。如果你的inline函数体非常巨大(比如几百行代码),而它又被到处调用,那么你的 App 包体积(DEX Size)会迅速膨胀,因为那几百行代码被复制粘贴到了每一个调用处。短小精悍的函数才配叫inline。
2026-02-05 15:15:00
118
原创 深入理解 Android 渲染管线:为什么你的自定义 View 会掉帧?
看主线程onDraw里是否有耗时计算?是否有对象分配(GC)?看重绘频率:是不是在用驱动本该用完成的动画?看 GPU 压力:是不是用了drawPath画几千个点的曲线?是不是用了clipPath?是不是无意中开启了软件渲染层?Android 的渲染管线就像一条精密的流水线,主线程是把设计图纸(DisplayList)画好,RenderThread 是把图纸送到工厂(GPU)去生产。任何一方掉链子,你的 View 都会卡。
2026-02-04 09:38:10
873
原创 LiveData 到 Flow 的迁移:我踩过的 5 个坑
迁移完成后,我对 LiveData 和 Flow 的理解是:简单、保守、UI 友好强大、灵活,但需要你承担设计成本如果项目:状态简单数据源单一LiveData 并不落后如果项目:多数据源有组合 / 转换 / 背压需求Flow 才是真正的优势区LiveData → Flow,不是语法迁移,而是心智模型迁移。如果你只是“为了用而用”,Flow 反而会让系统更复杂。
2026-02-03 21:02:19
769
原创 Android 设置ScrollView不可滚动
前言:设置ScrollView不可滚动? 咋一听可能觉得很鸡肋,如果你不需要滚动,为什么要用ScrollView呢?但是在需求越来越复杂的今天,有很多场景是完全需要用到的。比如你需要在一些情况下,开启滚动,在一些情况下又需要关闭滚动。思路:当然,ScrollView本身没有方法去关闭开启滚动。所以我们需要创建新的文件 ,继承ScrollView。 重写onTouchEvent...
2019-10-29 11:16:55
8979
原创 Android仿今日头条极速版签到功能
前言:这个签到功能一开始想找找有没有现成的轮子,后来国内国外找了一圈也没发现类似的。只能自己动手撸一个。注意:这个自定义view我并没有适配warp_content,也就是说,你只能给它固定的高度,比如200dp。否则它会默认填满你的整个屏幕。另外 像dip2px这种代码,每位开发者自己应该都有,我就不补充了,像图片文件,我这边也不好补充。这篇文章不会教你如何直...
2019-08-23 14:38:31
2175
1
原创 Android 开发浏览器 多窗口功能
序言:前阵子开发了一个浏览器的app,其中碰到一个难题,就是浏览器的多窗口。当时搜索了整个百度和google,都没有特别好的解决方案,最后用了一个笨方法实现了这个多窗口的功能。特意写出这篇文章,一来是为了后人碰到这种需求时,起码有一个解决方案。二来是一起学习交流,一起讨论看看还有什么更好的解决方案。预览图:实现:多窗口我采用的是viewpager+fragment的...
2019-01-31 11:54:19
5622
14
原创 重写RecyclerView实现下滑关闭功能
下拉关闭效果,大致如上图(网上随便找的)序言:如果你只是简单实现这种效果,Android原生就已经有一个很不错的控件:BottomSheetDialog ,相信你可以通过这个名字轻松搜索出它的用法,用法非常简单。如果你有特殊需求,不能使用dialog,单靠一个RecycleView实现这种下拉关闭的效果,那你可以试试我这种方式。思路:我们首先要知道,这...
2019-01-02 16:54:10
1559
原创 继承ViewGroup自己实现一个流式布局(FlowLayout)
2019年第一篇博客,祝愿自己能越来越好 。 今天给大家带来的是自定义View实现流式布局,如上图的热搜词,他有的可能会很长,有的会很短,而一行容不下了会自动换行。用现有的布局很难实现这样的效果,所以我们需要自定义一个布局。 思路也很简单,先得到屏幕宽度,再得到每个子View(也就是每个长短不一的item)的宽度,子view的宽度加起来大于屏幕宽度,就换到下一行排列。...
2019-01-02 11:20:53
333
原创 Android评论回复弹框
这是一个很多app评论回复的时候 , 经常用到的弹框。使用Dialog的方式,不会耦合布局,使用简单,可在任何地方使用。可自定义样式。进入自动弹出输入法,发送后自动关闭输入法,设置最大输入字数,超过字数后,字体会变红 等功能。下面是代码:public class InputTextMsgDialog extends AppCompatDialog { pri...
2018-12-14 14:26:07
9730
36
原创 Android 使用BRVAH实现拖拽功能
如上图的效果,我们可以使用BRVAH框架来迅速实现此功能如果你还不了解此框架可以点击这里下面是代码:public class ItemDragAdapter extends BaseItemDraggableAdapter<String, BaseViewHolder> { public ItemDragAdapter(List data) ...
2018-12-14 09:28:19
1902
8
原创 监听RecyclerView滑动事件
监听RecyclerView的滑动事件,一开始我总会选择使用ScrollView嵌套RecyclerView的方式,因为ScrollView有自带的监听滑动方法。但是也有缺点,上拉加载更多数据是无效的。 如果使用了ScrollView嵌套RecyclerView,那么一进入页面,RecyclerView的所有数据都会显示出来,这在数据很多的时候,会出现内存溢出,所以谷歌官方也是不推荐使用...
2018-09-19 16:23:19
6113
原创 在Textview左边或右边添加图标 ,换行不错位(非DrawableLeft)
如题,在textview左边或右边添加一个小图标,并且换行时显示效果不会出错,效果如下图。 刚开始看到这个需求,我也没有在意,觉得用drawableLeft或者横向布局即可搞定,但是当我做完之后,发现事情并不简单! 首先如果使用以上两种方法,换行后,图标就会单独居中,显示效果错位。 所以我们就要用到了 SpannableString 上代码: ...
2018-08-20 10:44:31
5758
2
原创 Android RecyclerView的item宽度保持四个半
现在有这么一个需求,实现下图的UI。 我想你应该能想到用RecyclerView实现, 当我唰唰唰几分钟做完之后,UI设计师跟我说,每个item,无论在什么手机上,都要显示四个半,具体看下图。我们都知道,Android手机的屏幕大小不一,这种需求我们不可能把图片的宽写死,或者写成wrap_content,这个时候就要在java代码中重新测量并且重新设置宽了。代码如下:...
2018-07-13 16:34:02
4322
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅