Java删除侦听器,当执行回调时

Java删除侦听器,当执行回调时,java,events,Java,Events,我就是想不出在执行某个事件时如何删除侦听器。我在使用WebSocket时遇到了一些泄漏问题,这可能会解决它 final WebSocket w = asyncHttpClient.prepareGet(url) .execute(new WebSocketUpgradeHandler.Builder().build()) .get(); w.addWebSocketListener(new WebSocketTextListener() { public void o

我就是想不出在执行某个事件时如何删除侦听器。我在使用WebSocket时遇到了一些泄漏问题,这可能会解决它

final WebSocket w = asyncHttpClient.prepareGet(url)
    .execute(new WebSocketUpgradeHandler.Builder().build())
    .get();

w.addWebSocketListener(new WebSocketTextListener() {

    public void onMessage(String message) {
        listener.onMessage(responseMessage);
        // Here is the place I want to do my w.removeWebSocketListener(l);
    }

    @Override
    public void onFragment(String s, boolean b) {
    }

    public void onOpen(WebSocket websocket) {
    }

    @Override
    public void onClose(WebSocket webSocket) {
    }

    @Override
    public void onError(Throwable throwable) {
    }

});
问题是当我创建
WebSocketTextListener lis=new….
时,传入的对象类似于一个对象需要另一个对象,而另一个对象依赖于此,现在我仍然可以做我想做的事情。

看起来很简单,但无法理解。

通常可以使用
removeXXXListener
方法删除事件侦听器。但它要求您提供与参数完全相同的事件侦听器实例。您可以存储事件侦听器,然后使用相同的引用将其删除。但是,由于您在
onMessage
消息中已经在事件侦听器的范围内,因此使用
应该可以工作

试试像这样的东西

listener.onMessage(responseMessage);
// Here is the place I want to do my w.removeWebSocketListener(l);
w.removeWebSocketListener(this);

在匿名的内部类中使用“this”是解决问题的方法。但是,为了可测试性和更好的理解,最好重构代码,避免使用不知名的类。

当您取消对行的注释时,会发生什么?现在这是不可行的,因为我没有侦听器的名称。如果我将代码更改为WebSocketTextListener lis=新的WebSocketTextListener(){….w.removeWebSocketListener(lis);}eclipse说我需要最终的WebSocketTextListener lis=。。。现在它抱怨监听器不能实例化,但现在我可以在前面添加行WebSocketTextListener lis=null。因为它是最终的,你仍然没有太多的意义
final WebSocketTextListener lis=new WebSocketTextListener(){….w.removeWebSocketListener(lis);}
应该可以工作,为什么不呢?因为我只能将final对象传递给noname类,但如果这样做,eclipse会抱怨监听器可能无法实例化(强迫我做WebSocketTextListener lis=null;在实际创建lis=new之前…但是如果我使用null,我就不能再更改引用,因为它是最终的。重构它的最佳方法是什么,有什么想法吗?但是你正在将最终对象传递给noname类,它是同一个noname类的实例。你正在传递
lis
进入
lis
,并且
lis
是最终的。因此,我不知道是什么绊倒了你。好吧,我想我现在明白了:
lis
在范围之内,但是Java不允许你使用它,因为它可能在那一点上没有被分配。然后我想唯一的选择是使用
这个
,正如你的回答者所解释的。“这个”在本例中,是对noname listener的引用吗?将尝试它,因为它实际上删除了listenerYep-因为您正在定义一个
新的WebSocketTextListener
中的所有代码(匿名)类将使用
this
作为对侦听器本身的引用。当
}
结束类时,
this
将不再指向侦听器,而是指向其他对象(在本例中,您定义
w
的类。仅供参考:-)