0

当我执行某些事件时,我只是不知道如何删除侦听器。我在使用 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 ....并传入时,一个对象需要另一个对象,而另一个对象依赖于此,现在我仍然可以做我想做的事。
看起来很简单,但无法弄清楚。

4

2 回答 2

1

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

尝试类似的东西

listener.onMessage(responseMessage);
// Here is the place I want to do my w.removeWebSocketListener(l);
w.removeWebSocketListener(this);
于 2012-11-08T11:48:26.453 回答
1

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

于 2012-11-30T08:38:35.677 回答