gwt の Panel.clear() メソッドでは、すべての子ウィジェットがクリアされます。それは、それらの子ウィジェットに関連付けられているすべてのハンドラーも削除されるか、ガベージ コレクションも行われるということですか?
2 に答える
はい、そうです (少なくとも、子ウィジェットが eventBus のようなアプリケーション横断オブジェクトへの参照を消去し、循環参照を保持しない場合)。
このドキュメントに従って
コア GWT ウィジェット システムには、リークをトリガーすることを不可能にする非常に特殊なイベント処理システムがあります。また、JSNI に直接アクセスしてイベント ハンドラーを自分で接続しない限り (Event.sinkEvents() などを使用しても問題ありません)、IE でも機能します。
Widget.removeEventListener() または HandlerRegistration.removeHandler() の呼び出しは、イベントの受信を停止する以外の理由で必要 (または有用) ではありません(これが removeHandler() を HandlerRegistration に組み込んだ理由の 1 つです。ほとんどの人はその必要はありません)。あれを呼べ)。
とこのブログ投稿。
ただし、アプリケーション レベルの Java 風のメモリ リークを回避するには、removeHandler が必要です。
常に表示されるナビゲーション バー ウィジェットやアプリケーション全体の EventBus などの「グローバル」イベント ソースがあり、イベントをリッスンするプレゼンターなどの一時的なイベント リスナーがある場合、プレゼンターのイベント ハンドラーはそれがガベージにならないようにします。 EventBus もガベージ コレクションされるまで収集されます。
したがって、ウィジェットや @UIHandler について心配する必要はありません。タブをクリアするだけで機能します。