为了账号安全,请及时绑定邮箱和手机立即绑定

使用计时器删除 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 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信