【问题标题】:Android app and static storage between activitiesAndroid 应用和活动之间的静态存储
【发布时间】:2012-10-04 12:24:17
【问题描述】:

我有一个 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,但是,此时,在ActionActivity 的 onCreate (应该初始化 Global 类)我得到一个异常,因为 getData() 返回 null (并且 isInitialized() 是 false ),因为 Global 类从未被 MainActivity 初始化。

那么,如果发生意外异常之类的事情,是否可以释放/清除像我的 Global 类这样的静态成员的对象?

【问题讨论】:

  • 你为什么不尝试把这个类设为单例......

标签: android android-activity static singleton storage


【解决方案1】:

一般来说,活动应该是相互独立的。你不应该依赖它们以任何特定的顺序启动,或者根本不应该。

相反,如果您需要在活动之间共享全局状态数据,即不仅仅是通过onActivityResult(),子类Application 传递intent extra 或结果的参数,请将初始化代码放在其onCreate() 中并从活动中访问它使用getApplication()。还要记住在清单中声明应用程序类。当您的任何活动正在运行时,系统会注意应用程序对象是否存在。

【讨论】:

  • 并且应用程序对象是持久的,或者如果需要可以重新初始化/重新分配?我必须确保我的数据只初始化一次...
  • 任何时候最多只有一个应用程序对象的实例。它不是持久的,而是在您的应用程序启动时创建的。如果您需要持久性,请使用数据库、SharedPreferences、文件或类似的东西。
  • 我的意思是应用程序生命周期中的持久性,所以是的,它是持久性的 :)
【解决方案2】:

在 Android 中,每当应用程序崩溃时,静态变量都会被丢弃。这就是您收到NullPointerException 的原因。与其使对象成为静态对象,不如创建一个ParcelableSerializable 类并获取和设置字段,然后按意图传递该对象。在另一个活动中,您可以获得 ParcelableSerializable 类,您可以使用它的属性。

【讨论】:

  • 我不需要一个可序列化的对象,我不必每次都从文件系统存储或类似的东西中读取,我只需要它在应用程序生命周期内保持不变。
  • 在 Application 类中,如果您将设置您的对象并且如果您的应用程序将崩溃,那么您将丢失您的对象。所以最好在 getData() 方法中检查对象的值,如果对象为 null,则创建该类的实例,以便重新初始化该对象。
  • 如果整个应用程序崩溃,我可以松开对象 :)
  • 那么最好按照@laalto 的建议使用 Application 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多