Android静态变量丢失 [英] Android static variables are lost

查看:472
本文介绍了Android静态变量丢失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



以下是我的课程定义:

  public class PlayerProperties {

//运行时但是不变的属性
public static int screenHeight;
public static int screenWidth;
public static String androidId;

//静态属性

// Url
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;

//开发人员密钥
public static final String youtubeDeveloperKey =ABCDEFGH ...;

//文件夹结构
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 /;

//共享首选项键
public static final String ANDROID_ID_KEY =ANDROID_ID;
public static final String MY_PREFERENCES_KEY =MyPrefs;


//常规属性
public static final String dateTimeFormatString =ddMMyyyyHHmmss;
public static final String dateFormatString =yyyy-MM-dd;

//超时
public static final int httpPollTimeout = 20000; // in millis
public static final int pingPeriodicity = 30; //以秒为单位
public static final int updateCheckPeriodicity = 24; //在hrs
中public static final int pushEnabledPollPeriodicity = 30; // in secs
public static final int pushDisabledPollPeriodicity = 30; //以秒为单位
public static final int statsUploadPeriodicity = 60; //分钟
public static final int logsUploadPeriodicity = 24; //以小时为单位
public static final int cleanupPeriodicity = 24; //以小时为单位
public static final int registrationStatusRecheckPeriod = 20000; // in millis
public static final int tokenResendToServerPeriod = 20000; // in millis

//其他
public static final int maxTextHeight = 50; //在dp
...
}

中我没有储存参考实例化PlayerProperties类,因为包含在内的所有变量都是静态的。



当我使用 PlayerProperties.androidId ,我有时候会得到空。



我已经在其中一个活动中初始化变量:

  PlayerProperties.androidId = sharedpreferences.getString(PlayerProperties.ANDROID_ID_KEY,String.valueOf(UUID.randomUUID())); 




  1. 我怀疑垃圾回收器是被android之间。如果gc确实启动了,是否会关闭所有运行时初始化的静态变量?

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

  3. $ b

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

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

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


  6. 与低端处理器无关,很容易引起他们的反驳,但JVM足够强大。



I am using a class with only static variables to store all constants and run-time properties. But, recently I have seen instances when I'm referencing these variables, I get null.

Following is my class definition:

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

I have not stored any reference instantiatin PlayerProperties class, as all variables contained within are static.

When I am referencing the variable androidId using PlayerProperties.androidId , I SOMETIMES get null.

I have initialized the variable in one of the activities:

PlayerProperties.androidId = sharedpreferences.getString(PlayerProperties.ANDROID_ID_KEY, String.valueOf(UUID.randomUUID()));

  1. My suspicion is that garbage collector was kicked by android in between. If gc does kick in, would it knock off all my runtime-initialized static variables ?

  2. Which memory segment are the static variables stored ?

  3. If not, what else could be the issue ?

Extra details: My app is configured to automatically launches on boot. I am facing the above described issue only with low end processors and when app is automatically triggered on boot.

解决方案

Please note the following in reference to above question:

  1. Garbage collector removes only unreferenced objects. Static variables will lose their values only when they are unloaded from JVM during run-time.

  2. Initialization happens when app is launched via activities. If there are any services/broadcast receivers that are accessing methods within other classes and use these ids, and the app is not yet running by that time, the uninitialized values are referenced as default value. In case of string - it is null.

  3. Nothing to do with low-end processors, easy to blame them often but JVM is powerful enough.

这篇关于Android静态变量丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆