繁体   English   中英

如何退订TornadoFX中的事件?

[英]How to unsubscribe events in TornadoFX?

在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))
        }
    }
}

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

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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM