Android:静态字段的值在静态块中设置一次后会丢失

问题描述:

我正在开发Android项目。我有一些静态字段。我使用静态块从另一个类初始化这些字段。但是,当程序中稍后访问静态字段时,字段中设置的值将丢失。Android:静态字段的值在静态块中设置一次后会丢失

请参阅下面的两个类:

public class Constants { 
    static { 
     String TAG = "Credentials"; 
     Log.d(TAG, "Inside static block"); 
     Logger.setCredentials(tempUserId, tempPasswd); 
     Log.d(TAG, "Inside static block : Logger.userId : " + 
       Logger.userId + " : Logger.password : " + Logger.password); 
     new Logger("Test"); 
     Log.d(TAG, "Inside static block : After creatinf object : Logger.userId : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 

    } 
} 

public class Logger { 
    public static String userId; 
    public static String password; 

    public static void setCredentials(String userId, String password) { 
     Logger.userId = userId; 
     Logger.password = password; 
     Log.d("Credentials","Inside setCredentials : Logger.userId : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 
    } 

    public Logger(String tag) { 
     super(); 
     Log.d("Credentials","Inside constructor : Logger.userid : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 
     if (Logger.userId == null || Logger.password == null) { 
      throw new NullPointerException(); 
     } else { 
     } 
    } 
} 

程序输出:

内的静块

内setCredentials方法:Logger.userId:testuser的:Logger.password:abc.123

内部静态块:Logger.userId:testuser:Logger.password:abc.123

内部构造:Logger.userid:TESTUSER:Logger.password:abc.123

内部静块:后creatinf对象:Logger.userId:TESTUSER:Logger.password: abc.123

内部构造:Logger.userid:空:Logger.password:当作为一个Java应用程序运行空

显示java.lang.NullPointerException

的代码工作正常。在android中运行时,字段值会丢失。请提出发生了什么问题?

还有一件事,如果在代码中处理异常,那么在异常处理后再次调用静态块。

+0

你的控制流程非常尴尬 - 它应该被简化。我在哪里得到tempuser/tempPassword?他们只是常数 - 为什么不让记录器域最终? –

+0

您无法确定您的类是以何种顺序加载的,因此,它们的* static *代码的执行顺序如何。所以不要依赖一个类的静态代码来初始化另一个类的字段! – JimmyB

+0

tempuser/tempPassword从应用程序启动时仅从数据库中提取一次。记录器类将用于开发更多的应用程序。所以我在应用程序启动时动态初始化其静态字段。如果我使这些字段最终并在Logger类中初始化它们,我将不得不在每个应用程序中修改这些字段。 – sagarpdesai

这可能不是你现在的问题,但请考虑一下,Android不会对你的进程生存期(以及你的静态变量)持有多少控制权。 Android可以*地杀死你的进程(如果你的应用程序暂停)并在以后重新创建它。在需要和适当的情况下,您有责任保存州。