ShadowLooper.idle()与runToEndOfTasks()的区别及相关疑问
ShadowLooper.idle() 与 runToEndOfTasks() 的区别及常见疑问解答
核心差异
二者的核心区别完全在于测试调度器时钟是否自动推进:
ShadowLooper.idle():仅执行当前已到执行时间的任务(即延迟时间 ≤ 当前调度器时钟时间的Runnable),全程不会推进时钟。ShadowLooper.runToEndOfTasks():会自动推进调度器时钟,依次执行所有已调度的任务(包括延迟任务),直到任务队列彻底清空为止。
关于 idle() 是否执行 postDelayed() 任务
不是绝对不执行,得看任务的延迟时间是否已满足:
- 如果你的
postDelayed(runnable, delay)中,delay为0,或者当前调度器时钟已经走到了「当前时间 + delay」的时间点,那idle()会执行这个任务。 - 如果
delay还没到(比如当前时钟是0,你post了一个延迟1000ms的任务),那idle()不会执行它——因为时钟没推进,这个任务的执行时间还没到。
永久重复任务下 runToEndOfTasks() 的表现
如果有一个Runnable在执行时,自己再次调用 postDelayed() 把自己重新加入队列(形成永久循环),那么 runToEndOfTasks() 会陷入无限循环:
因为它会不断推进时钟执行任务,而每次执行完这个任务,队列里又会新增一个延迟的它,队列永远无法清空。最终要么测试因为超时被终止,要么一直卡在这个循环里。
内容的提问来源于stack exchange,提问作者fstanis
相关产品推荐
相关产品推荐

