2016-11-14 152 views
2

我正在使用一个只有静态变量的类来存储所有常量和运行时属性。但是,最近我看到了当我引用这些变量的情况下,我得到null。Android静态变量丢失

以下是我的类定义:

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 
    ... 
} 

我没有存储instantiatin PlayerProperties类中的任何引用,因为其中包含的所有变量都是静态的。

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

我已初始化变量的活动之一:

PlayerProperties.androidId = sharedpreferences.getString(PlayerProperties.ANDROID_ID_KEY, String.valueOf(UUID.randomUUID())); 
  1. 我怀疑是垃圾收集器是由机器人之间踢。如果gc确实启动了,是否会关闭所有运行时初始化的静态变量?

  2. 哪些内存段是存储的静态变量?

  3. 如果不是,那还有什么问题?

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

+0

它是空的,因为没有初始化....不管它的静态或不是你应该初始化它 –

回答

0

其他类请注意参考上面的问题如下:

  1. 垃圾收集器删除未引用的唯一OB jects。静态变量只有在运行时从JVM卸载时才会丢失它们的值。

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

  3. 与低端处理器无关,很容易将其归咎于他们,但JVM足够强大。

0

androidId是一个字符串的引用,字符串是一类,如果你不这样做,将在默认情况下得到一个空引用作为初值....

看看这个从Oracle的doc

采取

enter image description here

所以基本上androidId为null,因为没有初始化....的事实变量是静态的则不是在这种情况下有关...

看到here更多细节

......我有时会空。

是的,你会得到永远除非在运行时它的值更改为空...

+0

我已经确保我在运行时初始化变量。我编辑了问题的详细信息。请检查。 – jay

1

只有public static String androidId;可以为空,当你想使用它,你应该初始化它在这个类或者在某些在onResume()

+0

为什么要特别onResume? – jay

+0

,因为当你的应用程序在后台运行'androidId'获取garbageCollected时,并且当你的应用程序再次打开时,它会激发'onResume()',因此当你在'androidId'上设置时它应该没问题。另见[这里](http://www.javatpoint.com/images/androidimages/Android-Activity-Lifecycle.png) –