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

时间:2012-11-08 11:41:19

标签: java events

当我执行某个事件时,我无法弄清楚如何删除侦听器。我有一些使用websockets的泄漏问题,这可以解决它。

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 ....并且传入时,有一个对象需要其他对象而其他对象依赖于此,我现在仍然可以做我想做的事。
看起来它很简单,但无法弄明白。

2 个答案:

答案 0 :(得分:0)

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

尝试类似

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

答案 1 :(得分:0)

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