【问题标题】:Clearing Static data onDestroy()清除静态数据 onDestroy()
【发布时间】:2012-04-02 16:38:26
【问题描述】:

在我的应用程序中有一个类,我在其中声明了一些 static 变量。问题是应用程序被销毁时所有变量的值都没有重置。
有没有办法在应用程序被销毁时重置所有静态变量的值,除了在onDestroy()中单独重置它们?

【问题讨论】:

    标签: android static android-activity


    【解决方案1】:

    这是不可能的,当你的活动被破坏时,你的静态变量必须是明确的。 您的静态变量可能在其他活动中声明,而您破坏了其他活动。

    Activity loses almost all the references once get destroyed.
    

    【讨论】:

    • 变量在一个单独的类中声明,这不是一个活动。当第一个 Activity 启动时,它们会被初始化。但是当我完成应用程序并检查值时,它们会保留在那里的值。
    • 因此您必须手动清除它。在活动的 onDestroy() 中 staticvariable=""/null;
    【解决方案2】:

    onDestroy() 中,您可以将null 值设置为static variables..

    编辑:

    Static variables 在包含的类时创建并初始化 它们由类加载器加载到 VM 中。上课时 卸载或虚拟机结束,静态变量会“噗”的一声。有 一般不需要清除它们。

    我想如果你愿意,你可以在 onTerminate() 中清除它们 方法(在应用程序中)或onDestroy() 方法(在活动中), 但这样做没有多大意义,也不能保证 这两种方法中的任何一种都会被调用。

    如果您出于某种原因偏执于变量不存在 创建时清除(严重违反虚拟机的“合同”),您 可以用onCreate() 方法清除它们。

    【讨论】:

      【解决方案3】:

      当您的活动之星检查您的变量时。一旦活动被破坏,所有变量都会再次初始化。检查您的变量值。 一旦活动被破坏,您的变量值就不可能相同。检查那个当你的变量值初始化的时候。

      或在 Destroy 方法上重新初始化变量。静态变量="" 或静态变量=null。

      【讨论】:

      • 静态变量不会按实例初始化。它们绑定到类而不是实例。
      【解决方案4】:
      class MySettings {
          // final can't be changed
          public static final String CONSTANT = "ucantchangeme";
      
          // static - all Objects have just these - even different Acitivities etc
          public static String sUserName;
      
          // class instance members - each Object you create with new has its own version
          public String mUserName;
      
          public MySettings() {
              mUserName = "uninitialized";
          }
      
          public static void init() {
              sUserName = "Peter";
          }
      
          public static void reset() {
              sUserName = null;
          }
      }
      
      /* Your Activity */
      class MyActivity extends Actitivy {
          private MySettings mSettings;
          private MySettings mOtherSettings;
      
          onCreate() {
              // init those static parts of MySettings
              MySettings.init();
      
              mSettings = new mSettings();
              mSettings.mUserName = "Peter"
              Log.d("TAG", "Username: " + mSettings.mUserName);
              // prints Peter
      
              // this could also be another Activity
              mOtherSettings = new MySettings();
              Log.d("TAG", "Username: " + mOtherSettings.mUserName);
              // prints "uninitialized"
      
              MySettings.sUserName = "Jim";
              Log.d("TAG", "Username: " + MySettings.sUserName);
              // prints "Jim"
      
              mSettings.sUserName = "Joe";
              Log.d("TAG", "Username: " + MySettings.sUserName);
              Log.d("TAG", "Username: " + mSettings.sUserName);
              Log.d("TAG", "Username: " + mOtherSettings.sUserName);
              // all print "Joe" now
          }
      
          onDestroy() {
              // clear MySettings
              MySettings.reset();
          }
      }
      

      您可以将静态变量重置为null 或您想要的任何值,但是将静态变量用于其他事情然后常量通常是一个坏主意 - 这通常是糟糕的类设计,并且可能导致像您观察到的那样的意外行为。

      只要类被加载,静态变量的值就会一直存在——它几乎与 Activity 生命周期无关(onCreate, ..., onDestroy

      第一次从代码中访问一个类时,它会被加载,然后直到有理由卸载它才会消失。在此期间,您的应用程序中的任何内容(技术上在同一个进程中 - 通常每个 .apk 都使用自己的)将从这些静态数据中读取相同的值。如果你从不同的地方改变它,你就会为不知道改变的其他部分改变它——这就是它不好的原因:)

      Android 将卸载类的唯一原因(我知道)是您的应用程序完全从内存中删除 - 无论是通过任务杀手,还是当您的应用程序不再处于活动状态且内存不足时。这完全超出了您的控制范围,并且在使用您的应用程序时不应发生。它可能会发生,例如有电话打进来,您的应用稍后会恢复。

      【讨论】:

      • 和我现在做的一模一样,但是有很多静态变量,需要重新设置,所以我在想是否有更好或更干净的方法来做到这一点。
      • 它只有在您像reset() 中那样手动执行时才有效。如果你有很多,你可以用reflection 在所有字段的循环中做到这一点,但我不会这样做。
      【解决方案5】:

      如果您在创建时重置静态变量,它们不再是静态的,您也可以使用非静态变量。

      事实上,由于指定的静态变量行为与 Android 的应用生命周期之间缺乏同步性,因此这样做很可能会更好。

      【讨论】:

        猜你喜欢
        • 2020-07-19
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多