面试题答案
一键面试优化协程调度器选择
- 不同调度器特点
Dispatchers.Default
:适合CPU密集型任务,它使用一个共享的线程池,线程数量根据CPU核心数动态调整。Dispatchers.IO
:适合I/O密集型任务,它有一个较大的线程池,适用于文件操作、网络请求等。Dispatchers.Main
:用于更新UI等与主线程相关的操作,只能在Android主线程或JavaFX应用的主线程中使用。
- 示例代码
import kotlinx.coroutines.* fun main() = runBlocking { // CPU密集型任务 launch(Dispatchers.Default) { val result = performCPUIntensiveTask() println("CPU密集型任务结果: $result") } // I/O密集型任务 launch(Dispatchers.IO) { val data = fetchDataFromNetwork() println("网络请求数据: $data") } // 更新UI操作(假设在Android环境) launch(Dispatchers.Main) { // 这里可以进行UI更新操作,如更新TextView等 println("在主线程更新UI") } } private suspend fun performCPUIntensiveTask(): Int { // 模拟CPU密集型计算 var sum = 0 for (i in 1..1000000) { sum += i } return sum } private suspend fun fetchDataFromNetwork(): String { // 模拟网络请求 delay(2000) return "网络响应数据" }
合理复用协程上下文
- 协程上下文概念 协程上下文包含了协程的调度器、Job、CoroutineName等信息。通过复用上下文,可以减少创建开销。
- 复用示例
import kotlinx.coroutines.* val customContext = CoroutineName("MyCoroutine") + Dispatchers.IO fun main() = runBlocking { val job1 = launch(customContext) { println("Job1在自定义上下文运行") } val job2 = launch(customContext) { println("Job2在自定义上下文运行") } job1.join() job2.join() }
避免协程泄漏
- 原因 当协程的生命周期没有正确管理,比如在Activity或Fragment销毁时,相关协程没有取消,就会导致协程泄漏。
- 解决方法
- 使用
CoroutineScope
结合Job
:在Activity或Fragment中,创建一个CoroutineScope
并关联一个Job
,在销毁时取消该Job
。 - 示例代码(以Android为例)
import android.os.Bundle import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.* class MainActivity : AppCompatActivity() { private lateinit var job: Job private val scope by lazy { CoroutineScope(Dispatchers.Main + job) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) job = Job() scope.launch { val data = fetchData() val textView: TextView = findViewById(R.id.textView) textView.text = data } } private suspend fun fetchData(): String { delay(5000) return "从网络获取的数据" } override fun onDestroy() { super.onDestroy() job.cancel() } }
- 使用
通过上述优化方式,可以有效提升基于Kotlin协程的异步编程模式的性能和稳定性,减少资源浪费和潜在的内存泄漏问题。