优化资源文件引用
- 删除未使用资源
- 使用 Android Lint 工具,它可以自动检测并报告项目中未使用的资源。在 Android Studio 中,通过
Analyze -> Inspect Code
运行 Lint 检查,然后在结果中找到未使用资源相关的警告并删除对应资源。
- 压缩图片资源
- 使用
tools:scaleType
属性来指定图片缩放类型,避免在运行时进行不必要的缩放操作。例如在 ImageView
中:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/your_image"
tools:scaleType="centerCrop" />
- 利用 `WebP` 格式图片,其通常比传统的 `JPEG` 和 `PNG` 有更好的压缩率。在 Kotlin 代码中,可以这样加载 WebP 图片:
val imageView: ImageView = findViewById(R.id.imageView)
val bitmap = BitmapFactory.decodeStream(resources.assets.open("image.webp"))
imageView.setImageBitmap(bitmap)
- 优化向量资源
- 使用向量可绘制图形(
VectorDrawable
)替代位图,特别是对于简单图形和可缩放图形。在 drawable
目录下创建 VectorDrawable
文件,例如 ic_icon.xml
:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF0000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM14.59,8.59L12,11.17 9.41,8.59 8,10l4,4 4,-4z" />
</vector>
- 在 Kotlin 代码中引用:
val imageView: ImageView = findViewById(R.id.imageView)
imageView.setImageResource(R.drawable.ic_icon)
代码层面精简
- 避免重复代码
- 使用函数或方法抽取重复代码块。例如,假设有重复的日志打印代码:
// 重复代码示例
Log.d("TAG", "User logged in successfully")
Log.d("TAG", "User logged out successfully")
// 优化后
fun logMessage(message: String) {
Log.d("TAG", message)
}
// 使用优化后的函数
logMessage("User logged in successfully")
logMessage("User logged out successfully")
- 使用 Extension 函数优化代码
- 例如,对
String
类扩展一个判断是否为空或仅包含空格的函数:
fun String.isNullOrBlank() = this == null || this.trim().isEmpty()
// 使用扩展函数
val str: String? = " "
if (str.isNullOrBlank()) {
Log.d("TAG", "String is empty or blank")
}
- Lambda 表达式简化代码
- 例如,在处理集合时,使用 Lambda 表达式替代传统的
for
循环。假设要遍历一个整数列表并打印每个元素:
val numbers = listOf(1, 2, 3, 4, 5)
numbers.forEach { number ->
Log.d("TAG", "Number: $number")
}
- 使用 Sealed Class 优化条件判断
- 例如,定义一个表示网络请求状态的
Sealed Class
:
sealed class NetworkResult {
class Success(val data: Any) : NetworkResult()
class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
// 使用 Sealed Class 进行条件判断
fun handleNetworkResult(result: NetworkResult) {
when (result) {
is NetworkResult.Success -> Log.d("TAG", "Success: ${result.data}")
is NetworkResult.Error -> Log.d("TAG", "Error: ${result.message}")
NetworkResult.Loading -> Log.d("TAG", "Loading...")
}
}