2012-11-08 44 views
0

我只是无法弄清楚当我执行一些事件时如何删除侦听器。我有一些泄漏问题使用websockets,这可能会修复它。Java删除侦听器,执行回调时

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 ....并传递有像一个对象需要其他的对象和其他对象是依赖于这一点,我现在仍然允许做我想做的。
看起来这是简单的东西,但无法弄清楚。

+0

取消注释行时会发生什么? –

+0

现在这是不可行的,因为我没有听众的名字。如果我将代码更改为WebSocketTextListener lis = new WebSocketTextListener(){.... w.removeWebSocketListener(lis); } eclipse说,我需要有最终的WebSocketTextListener lis = ...现在它抱怨说,侦听器可以不实例化,但现在我现在被允许添加行WebSocketTextListener lis = null之前。因为这是最后的 – user1424119

+0

你仍然没有很大的意义。 '最后的WebSocketTextListener lis = new WebSocketTextListener(){.... w.removeWebSocketListener(lis); }'应该工作,为什么不'呢? –

回答

0

通常可以用removeXXXListener方法删除事件监听器。但它要求您提供确切的相同的事件侦听器实例作为参数。您可以存储事件侦听器,并稍后使用相同的引用将其删除。但既然你,在onMessage消息已经在事件监听器的范围内,使用this应该工作。

尝试像

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

在这种情况下,“this”是否引用noname侦听器?将尝试它 – user1424119

+0

感谢它实际上删除了监听器 – user1424119

+0

是的 - 因为你正在定义一个新的WebSocketTextListener'所有(匿名)类中的代码将使用''this''作为引用到监听器本身。当''''结束类时,''this''不会再指向监听器,而是指向其他的东西(在这个例子中是你定义''w''的类。只是FYI :-) –

0

使用“本”在anonumous内部类是解决问题的办法。但是,重构代码,避免使用匿名类,为了可测试性和更好的理解,会更好。