亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用計時器刪除 ListenerAdapter

使用計時器刪除 ListenerAdapter

慕雪6442864 2023-04-26 17:20:52
所以我有以下問題,我想在文本頻道上制作一個迷你游戲,問題是,我想創建某種超時,這樣人們就不會創建多個只會使機器人過載的“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() 時觸發)。


查看完整回答
反對 回復 2023-04-26
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號