所以我有以下問題,我想在文本頻道上制作一個迷你游戲,問題是,我想創建某種超時,這樣人們就不會創建多個只會使機器人過載的“listenerAdapter”實例。我用來加載我的游戲事件的命令(ListenerAdapter 如下)。@Overridepublic void handle(List<String> args, GuildMessageReceivedEvent event) { // TODO Auto-generated method stub TextChannel channel = event.getChannel(); channel.sendMessage("please type \"joingame\" to join! ").queue(); event.getJDA().addEventListener(new MinigameEvent(channel, event.getAuthor(), event));}然后,我用來加載播放器的代碼如下:當我達到 3 人時,偵聽器適配器會按預期停止工作,當事件的作者(使用 !minigame 命令的人)類型取消時也是如此。但是當計時器關閉時,它會發送消息表明游戲已被取消,但偵聽器適配器仍在運行,如果有人試圖在之后加入,它將允許他這樣做。我目前通過使用 finalize 方法解決了這個問題,但我認為你可以做一些像 event.getJDA().removeEventListener(this); 這樣的事情。
1 回答

守候你守候我
TA貢獻1802條經驗 獲得超10個贊
你的問題是你this
指的是最近的類聲明。在這種情況下,這是由您創建的匿名類new TimeTask() { ...
。要引用實際注冊為偵聽器的外部類,您必須MinigameEvent.this
改為使用。
我強烈建議使用沒有此問題的 lambda 表達式。另一件需要注意的事情是您使用計時器會導致線程泄漏,因為它們永遠不會被您的代碼關閉(如何清理計時器)。更好的辦法是使用一個ScheduledExecutorService
你應該重復使用的單一來安排你需要的一切,而不是為每個任務創建一個新的。一旦您的進程結束,它就可以關閉(就像 JDA 中的 onShutdown 事件,它在調用 shutdown() 時觸發)。
添加回答
舉報
0/150
提交
取消