0

イベントを実行したときにリスナーを削除する方法がわかりません。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 ....あるオブジェクトが他のオブジェクトを必要とし、他のオブジェクトがこれに依存しているようなものを作成して渡すときに、今でも自分がやりたいことを実行できるようになっていることです。
シンプルなように見えますが、わかりません。

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 に答える