Android 开发常见知识点与最佳实践整理
Android 开发涉及 UI 交互、并发处理及语言特性等多个方面。总结了数字分隔符规范、ListAdapter 优势、手势缩放抖动优化方案、单指旋转算法实现、XML 预览修复技巧以及 AtomicInteger 和 CountDownLatch 的并发用法。同时介绍了 Kotlin 自定义 View 构造、集合操作符及常用开源库如 Glide、RxTool 的使用方式,旨在帮助开发者构建更稳定高效的移动应用。

Android 开发涉及 UI 交互、并发处理及语言特性等多个方面。总结了数字分隔符规范、ListAdapter 优势、手势缩放抖动优化方案、单指旋转算法实现、XML 预览修复技巧以及 AtomicInteger 和 CountDownLatch 的并发用法。同时介绍了 Kotlin 自定义 View 构造、集合操作符及常用开源库如 Glide、RxTool 的使用方式,旨在帮助开发者构建更稳定高效的移动应用。

本文整理了 Android 开发过程中涉及的语言特性、UI 交互、并发处理及常用开源库的核心知识点,旨在帮助开发者提升代码质量与开发效率。
在 Kotlin 和 Java 中,为了增强长数字的可读性,推荐使用下划线 _ 作为千位分隔符。这仅影响编译后的字节码可读性,不影响功能。
val largeNumber = 1_000_000 // 等同于 1000000
在处理频繁增删改查的列表场景时,推荐使用 ListAdapter 替代传统的 RecyclerView.Adapter。
优势:
LinearLayout 支持通过 XML 属性开启子视图添加/移除时的默认动画效果:
<LinearLayout
android:animateLayoutChanges="true"
... />
在使用 ScaleGestureDetector 进行双指缩放时,若 onScale 返回 true,检测器会重置缩放基准点,导致视觉抖动。应返回 false 以保持累积缩放比例。
class ScaleListener : ScaleGestureDetector.SimpleOnScaleGestureListener() {
private var scaleFactor = 1.0f
override fun onScale(detector: ScaleGestureDetector): Boolean {
scaleFactor *= detector.scaleFactor
scaleFactor = kotlin.math.max(0.5f, kotlin.math.min(scaleFactor, 2f))
targetView.scaleX = scaleFactor
targetView.scaleY = scaleFactor
// 返回 false 防止重置缩放基准,避免抖动
return false
}
override fun onScaleBegin(detector: ScaleGestureDetector): Boolean = true
override fun onScaleEnd(detector: ScaleGestureDetector) {}
}
利用 ScaleGestureDetector 的 onScale 或 getRotationDegrees 方法可直接获取旋转角度。
需手动计算触摸点相对于中心点的角度变化。核心逻辑为计算向量夹角并判断顺时针/逆时针方向。
private var degree = 0f
private var oriX = 0f
private var oriY = 0f
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
oriX = event.x
oriY = event.y
degree = rotation
}
MotionEvent.ACTION_MOVE -> {
val tempRawX = event.x
val tempRawY = event.y
val first = Point(oriX.toInt(), oriY.toInt())
val second = Point(tempRawX.toInt(), tempRawY.toInt())
val center = Point(width / 2, height / 2)
degree += calculateAngle(center, first, second)
rotation = degree
}
else -> {}
}
return true
}
private fun calculateAngle(cen: Point, first: Point, second: Point): Float {
val dx1 = (first.x - cen.x).toFloat()
val dy1 = (first.y - cen.y).toFloat()
val dx2 = (second.x - cen.x).toFloat()
val dy2 = (second.y - cen.y).toFloat()
val ab2 = ((second.x - first.x).toDouble() * (second.x - first.x).toDouble() +
(second.y - first.y).toDouble() * (second.y - first.y).toDouble()).toFloat()
val oa2 = dx1 * dx1 + dy1 * dy1
ob2 = dx2 * dx2 + dy2 * dy2
isClockwise = (first.x - cen.x) * (second.y - cen.y) - (first.y - cen.y) * (second.x - cen.x) >
cosDegree = (oa2 + ob2 - ab2) / ( * Math.sqrt(oa2.toDouble()) * Math.sqrt(ob2.toDouble()))
cosDegree = kotlin.math.max(-, kotlin.math.min(, cosDegree)).toFloat()
radian = Math.acos(cosDegree.toDouble())
( (isClockwise) Math.toDegrees(radian) -Math.toDegrees(radian)).toFloat()
}
使用 <merge> 标签时,若自定义 View 未指定父类,可能导致预览错乱。可通过 tools:parentTag 指定模拟父布局类型。
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="com.example.RulerLayout">
</merge>
保证整数操作的原子性,适用于计数器场景,无需锁机制即可实现线程安全。
val counter = AtomicInteger(0)
counter.incrementAndGet()
用于协调多个线程的执行顺序,允许一个或多个线程等待其他线程完成操作。常用于任务聚合或初始化等待。
CountDownLatch latch = new CountDownLatch(3);
// 三个线程执行完后 latch.countDown()
latch.await(); // 主线程等待
为避免反射调用失败,自定义 View 建议添加 @JvmOverloads 注解,提供默认参数。
class MyView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)
+ 运算符生成新集合,而非原地修改(不同于 Java 的 add)。
val list = mutableListOf<String>()
val newList = list + "NewItem" // 原 list 不变
val companies = listOf("Google", "Microsoft", "IBM")
val grouped = companies.groupBy { it.length }
map 保持嵌套结构,flatMap 展平嵌套集合。
val nested = listOf(listOf(1, 2), listOf(3, 4))
val flattened = nested.flatMap { it } // [1, 2, 3, 4]
val index = list.indexOfFirst { it > 5 }
综合工具库,涵盖文件、网络、剪贴板等常用功能。
implementation 'com.blankj:utilcodex:1.31.1'
图片加载框架,支持内存缓存、磁盘缓存及变形处理。
implementation 'com.github.bumptech.glide:glide:4.16.0'
RxJava 封装工具集,包含支付、二维码、定位等功能。
implementation 'com.github.tamsiree.RxTool:RxKit:2.6.3'
高性能视频播放器,支持多种格式及播放模式。 GitHub: CarGuo/GSYVideoPlayer
图片选择与裁剪库,支持多选、压缩及预览。 GitHub: LuckSiege/PictureSelector
以上知识点涵盖了 Android 开发中的 UI 交互、并发编程、Kotlin 语法糖及生态库选型,建议在实际项目中根据需求灵活应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online