2

クラスを使用してアクティビティ間で静的データを保存する Android アプリケーションがあります。

class Global
{
      private static boolean mInitialized = false;
  private static String  mData        = null;

  public static void init()
  {
    mData        = "something";
    mInitialized = true;
  }

      public static boolean isInitialized()
      {
            return mInitialized;
      }

  public static String getData()
  {
    return mData;
  }
}

したがって、メイン アクティビティ onCreate では、次のことを行います。

if( Global.isInitialized() == false )
    Global.init();

その後、他のアクティビティを開始します。アクション フローは次のとおりです。

MainActivity -> ActionActivity -> PluginActivity

Main は Global クラスを開始する場所で、Action & Plugin はそのクラスの getData() メソッドを使用する場所です。

場合によっては、本当に奇妙な動作が発生します... PluginActivity (たとえば NullPointerException ) で予期しないことが発生した場合、アクティビティがクラッシュし、アプリケーションはそれを起動した ActionActivity に戻りますが、この時点で、onCreate のActionActivity (Global クラスが初期化されるはずの場所) は、Global クラスが MainActivity によって初期化されなかったため、getData() が null (および isInitialized() が false ) を返すため、例外が発生します。

では、予期しない例外のようなものが発生した場合、グローバル クラスのような静的メンバーを持つオブジェクトを割り当て解除/クリアすることはできますか?

4

2 に答える 2

4

In general, activities should be independent of each other. You should not depend on them being launched in any particular order, or at all.

Instead, if you need to share global state data between activities, i.e. not just parameter passing in intent extras or results via onActivityResult(), subclass Application, put the init code in its onCreate() and access it from activities using getApplication(). Also remember to declare the application class in your manifest. The system takes care that the application object is there when any of your activities are running.

于 2012-10-04T12:32:42.023 に答える
0

Androidでは、アプリケーションがクラッシュするたびに静的変数が破棄されます。これがあなたが得ている理由ですNullPointerExceptionParcelableオブジェクトを静的にする代わりに、またはクラスを作成しSerializable 、フィールドを取得して設定してから、そのオブジェクトをインテントで渡します。別のアクティビティでは、それParcelableまたはSerializableクラスを取得して、そのプロパティを使用できます。

于 2012-10-04T12:40:02.170 に答える