1

どこでもアクティビティ/アプリケーションが必要なことについて少し問題があります...
より正確には、次のように定義されたクラスがあります。

public class MyApp extends Application {

     private static Activity currentActivity;
     private static MyApp instance;

     @Override
     public void onCreate() {
         super.onCreate();
         instance = this;
     }

     public static void setCurrentActivity(Activity activity) {
         currentActivity = activity;
     }
}

そして、私は次のような拡張アクティビティを持っています:

public class MyActivity extends Activity {

       ....

       @Override
       public void onResume() {
          super.onResume();
          MyApp.setCurrentActivity(this);
       }


       ....

       @Override
       public void onDestroy() {
          super.onDestroy();   
          MyApp.setCurrentActivity(null);  // for nullifying static reference

       }
 }

私の質問は次のとおりです。

  1. 上記のコード スニペットは公平ですか?
  2. アクティビティが正常に参照および破棄されていないことを確認するためsuper.onDestroy();に、の後に使用する必要がありますか?MyApp.setCurrentActivity(null);
  3. そして最も重要なのは、static reference instanceはどうですか? GC を妨げないようにどこで無効にできますか?

ありがとう。

4

1 に答える 1

0
  1. 上記のコード スニペットは公平ですか?

いいえ。最大の問題は にありMyActivity.onDestroy()ます。これは、アクティビティが使用されなくなったとき (つまり、終了後)いつでも呼び出すことができます。で無効にすると、 への参照がクリアされ、その時点で現在アクティブになっているアクティビティへの参照がクリアされます。私はあなたが本当に現在の活動を指し示したいと思っています.あなたができる最善のことは次のようなものです: if (MyApp.getCurrentActivity() == this) { MyApp.setCurrentActivity(null); } }currentActivityonDestroy()MyActivitycurrentActivity

onPause()また、アクティビティとonResume()次のアクティビティの間には小さなウィンドウがあるため、currentActivityこの間に null になる可能性があることに注意してください。気をつけて!

super.onDestroy(); を使用する必要がありますか? MyApp.setCurrentActivity(null) の後; アクティビティが正常に参照および破棄されていないことを確認するには?

上記の私のコメントを参照してください。でこの参照を無効にすることはできませんonDestroy()

そして最も重要なことは、静的参照インスタンスについてです。GC を妨げないようにどこで無効にできますか?

その必要はありません。createdのインスタンスは 1 つしかなくMyApp、プロセスが存在する限り存続します。Android がプロセスを必要としなくなった場合、プロセスを強制終了するだけで、すべてが自動的にクリーンアップされます。

于 2012-07-17T16:34:29.613 に答える