一、协程与并发编程
协程与线程的核心区别是什么?
协程是轻量级线程,通过挂起而非阻塞实现并发,减少上下文切换开销。线程是操作系统资源,创建和切换成本高。如何在Android中使用协程处理网络请求?
使用Dispatchers.IO
执行异步操作,Dispatchers.Main
更新UI,结合viewModelScope
避免内存泄漏。
viewModelScope.launch(Dispatchers.IO) {
val data = fetchData()
withContext(Dispatchers.Main) { updateUI(data) }
}
- 协程的异常处理有哪些方法?
try/catch
包裹可能抛出异常的代码块。
使用CoroutineExceptionHandler
全局处理异常。 - 解释协程的挂起(
suspend
)与阻塞(Blocking
)的区别
挂起释放线程资源,允许其他任务执行;阻塞占用线程直到操作完成。
二, Kotlin核心特性
-
Kotlin
如何解决空指针问题?
可空类型(String?)强制显式处理空值。
安全调用(?.)、Elvis操作符(?:)、非空断言(!!)。 - 密封类(Sealed Class)的应用场景?
限制子类数量,常用于状态管理(如网络请求结果)
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val e: Exception) : Result()
}
- 高阶函数(
Higher-Order Function
)的定义与使用场景
接受函数作为参数或返回函数,用于回调、集合操作(如map
、filter
)
fun RecyclerView.onItemClick(action: (Int) -> Unit) { ... }
- 扩展函数与扩展属性的作用?
在不修改原类的情况下添加功能
fun View.hide() { visibility = View.GONE }
数据类(
Data Class
)自动生成哪些方法?
equals()、hashCode()、toString()、copy(),
简化数据模型定义。inline
和reified
关键字的作用?
inline
减少函数调用开销,reified
使泛型类型在运行时可见
inline fun <reified T> Gson.fromJson(json: String) = fromJson(json, T::class.java)
三,Android开发实践
解释
ViewModel
与LiveData
的作用
ViewModel管理UI数据,生命周期感知;LiveData观察数据变化,自动更新UI。Jetpack Compose的
核心优势?
声明式UI框架,减少模板代码,支持实时预览,与Kotlin深度集成。约束布局(
ConstraintLayout
)的优势?
减少嵌套层级,通过链式约束(Chains
)和参考线(Guidelines
)优化布局性能。OkHttp
拦截器链的执行顺序?
依次为:重试拦截器、桥接拦截器、缓存拦截器、连接拦截器、请求服务拦截器。
四,性能与优化
内联类(
Inline Class
)的开销有哪些?
编译时可能导致代码膨胀。
运行时减少对象分配开销,适合包装基本类型。伴生对象(
Companion Object
)的作用?
替代Java静态方法,通过@JvmStatic
注解实现Java互操作。by lazy的工作原理?
延迟初始化属性,线程安全,首次访问时执行初始化逻辑。Kotlin
中Lambda
表达式的性能优化方法?
使用inline减少Lambda对象创建。
避免在循环中创建高阶函数。
五,、设计模式与架构
MVVM与MVP的区别?
MVVM通过数据绑定自动同步视图,MVP需手动更新UI。静态代理与动态代理的实现差异?
静态代理在编译时生成,动态代理通过反射运行时创建(如Retrofit接口代理)。解释依赖注入在Kotlin中的实现
使用Koin或Hilt框架,通过模块化声明依赖关系,减少耦合。
六,其他高频问题
Kotlin
相对于Java
的优势?
空安全、扩展函数、协程、更简洁的语法(如数据类)。Kotlin
的缺点?
编译速度较慢、生态系统成熟度低于Java。when
表达式与Java switch
的区别?
when支持任意类型、多条件匹配,无需break。作用域函数(
let、apply、run
)的区别?
| 函数 | 接收者(this/it) | 返回值 |
|--------|-------------------|----------------|
| apply | this | 对象自身 |
| let | it | Lambda 结果 |
-
utter
与Android
的通信方式?
通过MethodChannel
、EventChannel
实现跨平台方法调用和事件传递。
七,项目场景
如何实现多语言适配中的占位符?
使用%s(字符串)
、%d(整数)
等格式化字符串。扫码功能如何自定义扫描区域?
修改CameraManager
中的MIN_FRAME_WIDTH
和MAX_FRAME_HEIGHT
参数。说说一个你遇到的性能优化案例
(示例)通过协程替代多线程,减少内存泄漏;使用ConstraintLayout优化布局层级。Jetpack
组件中Room
数据库的核心功能?
提供ORM
支持,结合LiveData
实现数据观察,支持编译时SQL验证。
持续更新中....