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中运行时,字段值会丢失。请提出发生了什么问题?
还有一件事,如果在代码中处理异常,那么在异常处理后再次调用静态块。
答
这可能不是你现在的问题,但请考虑一下,Android不会对你的进程生存期(以及你的静态变量)持有多少控制权。 Android可以自由地杀死你的进程(如果你的应用程序暂停)并在以后重新创建它。在需要和适当的情况下,您有责任保存州。
你的控制流程非常尴尬 - 它应该被简化。我在哪里得到tempuser/tempPassword?他们只是常数 - 为什么不让记录器域最终? –
您无法确定您的类是以何种顺序加载的,因此,它们的* static *代码的执行顺序如何。所以不要依赖一个类的静态代码来初始化另一个类的字段! – JimmyB
tempuser/tempPassword从应用程序启动时仅从数据库中提取一次。记录器类将用于开发更多的应用程序。所以我在应用程序启动时动态初始化其静态字段。如果我使这些字段最终并在Logger类中初始化它们,我将不得不在每个应用程序中修改这些字段。 – sagarpdesai