当前位置: 首页 > 面试题库 >

Android静态变量丢失

何勇
2023-03-14
问题内容

我正在使用仅包含静态变量的类来存储所有常量和运行时属性。但是,最近我看到了引用这些变量的实例,但得到的却是null。

以下是我的课程定义:

public class PlayerProperties {

    // Runtime but constant properties
    public static int screenHeight;
    public static int screenWidth;
    public static String androidId;

    // Static properties

    // Urls
    public static final String baseUrl = "http://www.blynq.in/api/player/";

    public static final String registerUrlAppender = "activationKeyValid";
    public static final String schedulesUrlAppender = "getScreenData";
    public static final String updateUrlAppender = "updateAvailable";
    public static final String tokenRegisterUrl = "fcmRegister";
    public static final String mediaStatsUrl = "mediaStats";
    public static final String logsUrl = "logs";
    public static final String pingUrl = "ping";
    public static final String screenInfoUrl = "screenInfo";

    // Developer Keys
    public static final String youtubeDeveloperKey = "ABCDEFGH...";

    // Folder structure
    public static final String mediaFolder = "player/media";
    public static final String imagesFolder = "player/media/images";
    public static final String videosFolder = "player/media/videos";
    public static final String pdfFolder = "player/media/pdf";
    public static final String gifFolder = "player/media/gif";
    public static final String webFolder = "player/media/web";
    public static final String othersFolder = "player/media/others";
    public static final String logsFolder = "player/logs";

    public static final String defaultFolder = "player/default/";
    public static final String serFolder = "player/ser/";
    public static final String tempFolder = "player/temp/";

    // Shared Prefs Keys
    public static final String ANDROID_ID_KEY = "ANDROID_ID";
    public static final String MY_PREFERENCES_KEY = "MyPrefs";


    // General properties
    public static final String dateTimeFormatString = "ddMMyyyyHHmmss";
    public static final String dateFormatString = "yyyy-MM-dd";

    // Timeouts
    public static final int httpPollTimeout = 20000;                    // in millis
    public static final int pingPeriodicity = 30;                       // in secs
    public static final int updateCheckPeriodicity = 24;                // in hrs
    public static final int pushEnabledPollPeriodicity = 30;            // in secs
    public static final int pushDisabledPollPeriodicity = 30;           // in secs
    public static final int statsUploadPeriodicity = 60;                // in mins
    public static final int logsUploadPeriodicity = 24;                 // in hours
    public static final int cleanupPeriodicity = 24;                    // in hours
    public static final int registrationStatusRecheckPeriod = 20000;    // in millis
    public static final int tokenResendToServerPeriod = 20000;          // in millis

    // Others
    public static final int maxTextHeight = 50; // in dp
    ...
}

我没有html" target="_blank">存储任何引用实例化PlayerProperties类,因为其中包含的所有变量都是静态的。

当我使用引用变量androidId时PlayerProperties.androidId,我有时会得到null。

我已经在活动之一中初始化了变量:

PlayerProperties.androidId = sharedpreferences.getString(PlayerProperties.ANDROID_ID_KEY, String.valueOf(UUID.randomUUID()));
  1. 我的怀疑是,垃圾收集器在两者之​​间被android踢了。如果gc确实启动了,它将取消我所有运行时初始化的静态变量吗?

  2. 静态变量存储在哪个内存段中?

  3. 如果没有,那还有什么问题呢?

额外详细信息:我的应用程序配置为在启动时自动启动。我仅在低端处理器以及启动时自动触发应用程序时遇到上述问题。


问题答案:

请注意以下有关上述问题的信息:

  1. 垃圾收集器仅除去未引用的对象。静态变量只有在运行时从JVM卸载时才会丢失其值。

  2. 通过活动启动应用程序时会发生初始化。如果有任何服务/广播接收器正在访问其他类中的方法并使用这些ID,并且那时该应用程序尚未运行,则未初始化的值将作为默认值引用。如果是字符串,则为null。

  3. 与低端处理器无关,易于经常责备它们,但JVM足够强大。



 类似资料:
  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 静态变量 PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 PHP中的静态变量通过

  • 问题内容: 在android中,推荐使用静态变量吗?例如,用Java实现Singleton模式,我通常这样做: 此外,Android JVM何时可以清除此漏洞? 问题答案: 字段会整体附加到实例,而实例又附加到加载了类的。整个回收时将被卸载。我确信这会在销毁该应用程序时发生(不是在它进入后台或暂停但完全关闭时发生)。 因此,只要你的应用程序运行,就可以将其视为生存。Singleton是个好主意吗?

  • 我正在做一些大的重构操作,相对于android应用程序中的一些性能改进,该应用程序使用了一个带有大量静态变量的类,甚至静态活动引用,然后通过应用程序使用!因此,我在Android中寻找一些最佳实践来存储数据,并在我的应用程序中为这些数据提供全局访问。 首先,我删除了所有的活动引用,以避免任何内存泄漏,但我仍然希望知道什么是关于静态变量的最佳实践,这些变量需要在android应用程序的任何地方使用。

  • 问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时

  • 问题内容: 当我在主活动中将变量声明并初始化为静态变量时,活动被销毁。我仍然可以访问变量的内容吗? 例如,要始终访问我存储到此变量的AsyncTask?我想要的是在方向更改后也能够访问它。 问题答案: 静态变量与一个类相关联,并且只要该类在内存中,它们就会存在,并且在类被卸载时销毁(这很少发生)。 在Android中,您已经看到,当我们关闭任何应用程序时,它不会完全关闭,而是保留在最近的应用程序堆