web-dev-qa-db-ja.com

なぜJava Androidはデストラクタで一番上になりますか?

デストラクタのsuper.onDestroy();はどのロジックに基づいて上位に位置しますか?例えば:

protected void onDestroy() {        
    super.onDestroy();
    releaseMediaPlayer();
}

ではなく:

protected void onDestroy() {        
    releaseMediaPlayer();
    super.onDestroy();
}

C++、obj-c、Pascalなどのように?

48
Vassilis

onDestroyで何をしたいかに大きく依存します。これはsuper.onDestroyが行うことです(この順序で):

  • アクティビティが管理していたダイアログを閉じます。
  • アクティビティが管理していたカーソルをすべて閉じます。
  • 開いている検索ダイアログをすべて閉じます

onDestroy内に配置するロジックが、Androidが行う3つのことと関係がある場合は、順序について心配する必要があります。場合、それは問題ではありません。

59
Cristian

Reporting Work Status training のThreadSample.Zipには、onDestroy()にコメントがあります

public void onDestroy() {
    ...
    // Must always call the super method at the end.
    super.onDestroy();
}

したがって、おそらく放送受信機を使用する場合、スーパーは最後に行かなければなりません。

11
Zorfling

Base Androidクラスから拡張しているので、親クラスが作成中に最初に自身を作成および初期化し、子がシャットダウン/コンポーネントの停止:これは推奨されるアプローチですが、ユースケースとシナリオに完全に依存します。

public void onCreate(Bundle bundle){
   super.onCreate(bundle);
   //perform child class initializations.
}

public void onDestroy(){
   //perform uninitialization and free resource
    super.onDestroy();
}
8
siva

あなたの質問は何ですか?どちらの方法でもできます。スーパークラスのonDestroy()を自分の前に呼び出すかどうかによって異なります。通常、Androidで問題になるとは思いません。

また、onDestroy()はデストラクタではありません。実際にはオブジェクトを破壊しません。特定の状態に基づいて呼び出されるメソッドです。したがって、スーパークラスのonDestroy()が実行されて戻った後も、インスタンスはまだ生きていて非常に良好です*。

*ほとんどの場合、Androidはいつでもアクティビティを強制終了できますが、まだそこにあると想定できます。

5
Falmarri