【问题标题】:Queue tasks with Coroutines使用协程对任务进行排队
【发布时间】:2020-04-16 15:39:51
【问题描述】:

我最近开始阅读有关协程的内容,我想问一个特定的场景。

考虑一个带有一个按钮的简单屏幕。单击后,它会执行一堆打印语句和一些延迟(介于两者之间)。到目前为止,我正在使用协程来实现这一点。

现在,我的问题是,如果用户反复向这个按钮发送垃圾邮件,有没有办法将任务排队并在专用线程上一个接一个地执行(一旦前一个完成执行)?

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        val thread = newSingleThreadContext("thread")

        binding.button1.setOnClickListener {

            CoroutineScope(thread).launch {
               Log.d("ABC", " TEXT1 ")
               delay(1000)
               Log.d("ABC", " TEXT2 ")
               delay(2000)
            }

        }

}

现在,如果我执行这个,它运行良好,如果我按下按钮一次,我可以看到日志:

TEXT1
TEXT2

但是,如果我向按钮发送垃圾邮件,这就是我所看到的:

TEXT1
TEXT1
TEXT2
TEXT1
TEXT2
TEXT2

基本上,我观察到的情况是,当用户按下按钮时,couroutine 会在没有任何等待或检查的情况下执行。所以,我的问题是,我如何编辑代码,以便当用户向按钮发送垃圾邮件时,每个 courotine 会按顺序执行,并且每个 courotine 在下一个开始执行之前完成,以便输出如下所示:

TEXT1
TEXT2
TEXT1
TEXT2
TEXT1
TEXT2

【问题讨论】:

  • delay 正在挂起函数,因此它“释放”线程以供另一个继续执行。实现您想要的粗略方法是将delay 替换为Thread.sleep() 以保持线程被占用,但理想情况下您确实应该实现某种队列。
  • 是的!你说的对!谢谢。

标签: android kotlin kotlin-coroutines


【解决方案1】:

无论您使用什么线程或线程池,您都可以通过 Flow 获得该行为:

class MyActivity : CoroutineScope by MainScope() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        val myFlow = callbackFlow {
            binding.button1.setOnClickListener {
                offer(Unit)
            }
            awaitClose()
        }

        launch(Dispatchers.Default) {
            myFlow
                .collect {
                    Log.d("ABC", " TEXT1")
                    delay(1000)
                    Log.d("ABC", " TEXT2")
                    delay(2000)
                }
        }

    }

    override fun onDestroy() {
        super.onDestroy()
        cancel()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多