面试题答案
一键面试实现协程任务取消的步骤
- 创建协程作用域:使用
CoroutineScope
来管理协程的生命周期。 - 在协程作用域内启动协程:在该协程中执行网络请求。
- 取消协程:当用户关闭相关界面时,调用协程作用域的
cancel
方法来取消协程。
代码示例
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
class MainActivity : AppCompatActivity() {
private lateinit var scope: CoroutineScope
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
scope = CoroutineScope(Job() + Dispatchers.Main)
val startButton: Button = findViewById(R.id.startButton)
val cancelButton: Button = findViewById(R.id.cancelButton)
startButton.setOnClickListener {
scope.launch {
// 模拟网络请求
delay(5000)
println("网络请求完成")
}
}
cancelButton.setOnClickListener {
scope.cancel()
println("协程已取消")
}
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
}
}
在上述代码中:
CoroutineScope
通过Job()
和Dispatchers.Main
创建,Job()
用于管理协程生命周期,Dispatchers.Main
确保在主线程执行。- 点击
startButton
启动一个协程,模拟一个5秒的网络请求。 - 点击
cancelButton
或界面销毁时,调用scope.cancel()
取消协程,从而取消网络请求任务。