如何解决如何在允许彼此异步但不允许主线程的同时允许两个异步任务
我有两个异步任务,它们不应并行执行,即等到另一个任务完成后再开始。
我想我可以使一个变量指示一个正在进行中,而阻止另一个变量,但是我正在寻找更优雅的解决方案
为了进行测试,我具有以下两个功能,它们分别在ViewModel
MainActivity
的{{1}}类中运行
onCreate
它正在按要求运行,并显示下一个日志(请注意,class MainActivity : AppCompatActivity() {
override fun onCreate() {
//..
mainActivityViewModel.test1()
mainActivityViewModel.test2()
Log.d("testco","MainActivity: after test")
}
}
class MainActivityViewModel: ViewModel() {
fun test1() {
viewModelScope.launch {
coroutineScope {
Log.d("testco","test1: start")
Thread.sleep(4000)
Log.d("testco","test1: finished")
}
}
}
fun test2() {
viewModelScope.launch {
coroutineScope {
Log.d("testco","test2: start")
Thread.sleep(1000)
Log.d("testco","test2: finished")
}
}
}
}
直到test2
完成后才开始运行)
test1:start
test1:已完成
test2:开始
test2:已完成
MainActivity:经过测试
但是,正如您在日志中看到的那样,它阻塞了主线程
如何在日志中获得相同的行为但又不阻塞主线程?
ps:查看它说的test1
代码描述
使当前正在执行的线程进入睡眠状态...
所以我想这意味着它正在执行我期望的工作,即仅延迟正在执行的线程。另一方面,Thread.sleep
不会阻塞该线程。
解决方法
- 首选使用
suspend function
,因为Sequential by default。 - 不应使用
Thread.sleep
,而应使用delay
。
suspend fun task1() {
delay(200) // pretend we are doing something useful here
println("Task 1 done")
}
suspend fun task2() {
delay(100) // pretend we are doing something useful here
println("Task 2 done")
}
viewModelScope.launch {
task1()
task2()
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。