为什么直接启动时(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")
    }

您的代码中的延迟阻止了相同的消息连续出现,因为您同时记录了两个协程。