1

開始までに時間がかかるサービスがいくつかあります(1〜2分)。このプロセス中に、誰かがサービスの強制シャットダウン(つまり遷移STARTING -> STOPPING)を要求する場合があります。AbstractServiceクラスのソースを見るとdoStop() 、現在の状態STARTINGNEWつまり停止要求が受信されたときに基になるクラスに通知されない場合の呼び出しがないことがわかります。

  switch (snapshot.state) {
    case NEW:
      snapshot = new StateSnapshot(State.TERMINATED);
      terminated(State.NEW);
      break;
    case STARTING:
      snapshot = new StateSnapshot(State.STARTING, true, null);
      stopping(State.STARTING);
      break;
    case RUNNING:
      snapshot = new StateSnapshot(State.STOPPING);
      stopping(State.RUNNING);
      doStop();
      break;
    case STOPPING:
    case TERMINATED:
    case FAILED:
      // do nothing
      break;
    default:
      throw new AssertionError("Unexpected state: " + snapshot.state);
  }

状態に関係なくクリーンアップを実行する必要があるので、シャットダウンについて通知を受け取る方法はありますか?サブクラス内でService.Listenerを使用することをお勧めしますか?

4

1 に答える 1

4

doStop状態がいつであるか、NEWまたはSTARTING開始されていないサービスを停止する必要がないため、呼び出しはありません。これは、停止要求を受信したときに基になるクラスに通知されないという意味ではありません。のソースをstop()参照すると、状態が、の場合にNEW呼び出さterminatedれ、リスナーをキューに入れてterminatedメソッドを呼び出します。同様に、状態がである場合はSTARTINGstoppingが呼び出され、リスナーをキューに入れてstoppingメソッドを呼び出します。次に、キューに入れられたを実行するための呼び出しのfinallyブロック。stopexecuteListenersListener

つまり、はい、を使用することをお勧めしますService.Listener。状態遷移の通知を見逃さないように、開始する前にListener必ずにを追加してください。Service、、、およびメソッドはすべて、渡されたものを取得するfailedため、通常の場合(getsの場合)のsメソッドに、説明した場合のメソッドのブロック内にクリーンアップコードを含めることができます。起動中、および例外的な場合のメソッドで強制的にシャットダウンしたい。stoppingterminatedService.StateServiceListenerterminatedServiceRUNNINGif (from == STARTING)stoppingfailed

于 2012-09-01T13:51:20.037 に答える