Java删除侦听器,当执行回调时
我就是想不出在执行某个事件时如何删除侦听器。我在使用WebSocket时遇到了一些泄漏问题,这可能会解决它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
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
的类。仅供参考:-)