为什么直接启动时(Android),任务没有完成?
Why when launch without delay (in Android), it didn't finish the task?
下面我有一个简单的协程实验
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
}
}
这会打印全部 5 次,交替打印 launch
。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
但是,如果我从 launch
的代码中删除 delay(1)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
}
}
它只打印 2 次并按顺序打印 launch
。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
为什么没有完成所有 5 次循环?
注意事项 在单元测试中 运行 时它工作正常(非 Android 环境,即所有 5 次都被打印)
Android 的记录器在看到两个以上连续的相同消息后会忽略重复的日志消息,从而声明该包是“喋喋不休的”。
在没有协程的情况下试试这个,你会看到:
repeat(10) {
Log.d("all the same", "Hello World")
}
repeat(10) {
Log.d("with indices", "Hello World $it")
}
您的代码中的延迟阻止了相同的消息连续出现,因为您同时记录了两个协程。
下面我有一个简单的协程实验
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
}
}
这会打印全部 5 次,交替打印 launch
。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
但是,如果我从 launch
delay(1)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
}
}
它只打印 2 次并按顺序打印 launch
。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
为什么没有完成所有 5 次循环?
注意事项 在单元测试中 运行 时它工作正常(非 Android 环境,即所有 5 次都被打印)
Android 的记录器在看到两个以上连续的相同消息后会忽略重复的日志消息,从而声明该包是“喋喋不休的”。
在没有协程的情况下试试这个,你会看到:
repeat(10) {
Log.d("all the same", "Hello World")
}
repeat(10) {
Log.d("with indices", "Hello World $it")
}
您的代码中的延迟阻止了相同的消息连续出现,因为您同时记录了两个协程。