gpt4 book ai didi

java - 如何取消订阅 TornadoFX 中的 Activity ?

转载 作者:行者123 更新时间:2023-12-01 08:49:41 24 4
gpt4 key购买 nike

在TornadoFX中,我想取消订阅自定义事件,以便接收器永远不会再次处理不必要的事件,并且可能避免诸如内存泄漏之类的事情,但是,当我使用unsubscribe<MyEvent>时我的代码中的方法根本不起作用。这是我的代码的一部分:

object MyEventObj: FXEvent(EventBus.RunOn.BackgroundThread)
class MyEventBus(val personlist:List<PersonOld>): FXEvent()
class MyController: Controller()
{
init
{
subscribe<MyEventObj> {
unsubscribe<MyEventObj> {
println("Unsubscribe event!") //unsubscrib event and make sure the next code just runs once, but never works!
}
println("Event has received!")
val items = listOf(PersonOld("Name A", 20), PersonOld("Name B", 25))
fire(MyEventBus(items))
}
}
}

那么,问题出在哪里呢?以及如何使用unsubscribe在 TornadoFX 中?感谢您提前帮助我!

最佳答案

unsubscribe 函数将事件监听器作为唯一参数。因此,为了能够取消订阅,您需要将监听器保存为成员 val,以便您可以引用它。更有趣的是,您无法在监听器本身内部引用 this,因此您需要调用另一个函数才能成功取消订阅。这是一个完整的示例:

object MyEvent : FXEvent()

class MyView : View() {
override val root = stackpane {
paddingAll = 100
button("Fire!") {
setOnAction {
fire(MyEvent)
}
}
}

val myListener: (MyEvent) -> Unit = {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
stopListening()
}

init {
subscribe(myListener)
}

fun stopListening() = unsubscribe(myListener)

}

如果可以从监听器内部引用监听器,我们可以直接在监听器内部添加一个 unsubscribe() 调用,但这是不可能的,至少在 Kotlin 1.0 中是不可能的。

编辑:我们刚刚添加了一个 times = n 参数来订阅,因此您无需自己处理取消注册的问题。默认情况下,每次事件触发时都会触发您的事件监听器,但通过传递 1,您可以在第一次后自动取消注册。借助 TornadoFX 1.6.3 中的这一新功能,您可以简单地执行以下操作:

class MyView : View() {
override val root = stackpane {
paddingAll = 100
button("Fire!") {
setOnAction {
fire(MyEvent)
}
}
}

init {
subscribe<MyEvent>(times = 1) {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
}
}

}

EDIT2: TornadoFX 1.6.3 还将引入触发器操作的 EventContext,因此您将能够执行 unsubscribe() > 在下一个版本的事件监听器中。然后您可以将其作为 times 参数的替代方法:

subscribe<MyEvent> {
alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.")
unsubscribe()
}

关于java - 如何取消订阅 TornadoFX 中的 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com