android Kotlin是否有类似于Swift的perform(#selector)和NSObject.cancelPreviousPerformRequests(withTarget:)

8xiog9wr  于 2023-05-21  发布在  Android
关注(0)|答案(2)|浏览(145)

在Swift中,我可以使用下面的代码在7秒内调用一个函数,但我也可以在7秒之前随时取消它。Kotlin提供类似的功能吗?

// 1. call showTimeoutErrorLabel 7 seconds from now
perform(#selector(showTimeoutErrorLabel), with: nil, afterDelay: 7)

// 2. cancel the above perform() so that it won't fire off showTimeoutErrorLabel
NSObject.cancelPreviousPerformRequests(withTarget: self)
// or
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(showTimeoutErrorLabel), object: nil)

// the actual function
@objc func showTimeoutErrorLabel() { ... }

我在HandlersTimersExecutors上发现了一些Kotlin帖子,但没有关于如何取消它们并在必要时稍后召回它们的信息。

xa9qqrwz

xa9qqrwz1#

你的问题有点令人困惑,因为你混合了语言和它运行的操作系统环境。Kotlin什么都没有,因为Kotlin没有计时器的概念。其实Swift也没有。这是你正在查看的操作系统库的一部分,如果你试图在Windows上编写Swift,它可能不存在。
所以你在文章中提到的每一件事都可以取消。它们都以不同的方式被取消。对于处理程序,可以使用removeCallbacksAndMessages()。这将删除任何已发送到处理程序的内容(如果尚未处理)。对于计时器,您可以对其调用cancel()。你应该使用哪一个取决于你想做什么,它们都有不同的优缺点。

hk8txs48

hk8txs482#

我找到答案了here

var job: Job? = null

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

    job = GlobalScope.launch(Dispatchers.Main) {
        ensureActive() // edited my answer to include this. Read @GabeSechan's comments below
        delay(7000L)
        showTimeoutErrorLabel() // or as another example change the color of buttonA
    }

    binding.cancelButton.setOnClickListener {
        cancelJob()
    }
}

fun cancelJob() {
    job?.cancel()
}

fun showTimeoutErrorLabel() { ... }

相关问题