【結論】
onClosing()は成功でも失敗でもとりあえず実行される。
onClosed()は切断が成功した場合実行される。向こう側から一方的に閉じられた場合は実行されない。
順序はonClosing()の後にonClosed()
onClosed()はRealWebSocket#onReadClose()で呼ばれます。
if (toClose != null) {
listener.onClosed(this, code, reason);
}
このtoCloseは
if (enqueuedClose && messageAndCloseQueue.isEmpty()) {
toClose = this.streams;
これです。enqueuedCloseはclose()が呼ばれた時点で真になります。偽が代入される行はありません。
messageAndCloseQueueは、送信のキューです。send()で送信されるMessageや、close()でCloseがaddされます。writeOneFrame()でデキューと送信が行われます。
つまり、close()を実行している、かつ送信待ちキューがなくなっている、かつ向こうから切断要求・応答(Closeフレーム)が送られて来た時のみonClosed()は呼ばれます。
Closeフレームについてはこちら。