所以我有以下問題,我想在文本頻道上制作一個迷你游戲,問題是,我想創(chuàng)建某種超時,這樣人們就不會創(chuàng)建多個只會使機(jī)器人過載的“l(fā)istenerAdapter”實例。我用來加載我的游戲事件的命令(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));}然后,我用來加載播放器的代碼如下:當(dāng)我達(dá)到 3 人時,偵聽器適配器會按預(yù)期停止工作,當(dāng)事件的作者(使用 !minigame 命令的人)類型取消時也是如此。但是當(dāng)計時器關(guān)閉時,它會發(fā)送消息表明游戲已被取消,但偵聽器適配器仍在運(yùn)行,如果有人試圖在之后加入,它將允許他這樣做。我目前通過使用 finalize 方法解決了這個問題,但我認(rèn)為你可以做一些像 event.getJDA().removeEventListener(this); 這樣的事情。
1 回答

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