java Android单例类仅在第二次刷新时更新
我有一个名为DataManager
的单例类。当我在一个名为userProfile
的类(activity
)中调用onStop()
时,我更新了DataManager
中的一些数据。它从一些文本输入框中获取值,并更新DataManger
中的User
对象。我用BottomNavigationView
浏览我的应用程序,所以当我从userProfile
视图中按下home图标时,我应该调用userProfile
{singleton
类中的值被正确更新。当我试图从主页上读取这些值时,就会出现问题。这些值尚未更新。但是如果我重新打开视图或打开另一个视图,DataManager
中的值就是正确的更新值。你认为问题是什么
我不确定它是否相关,但是home和userProfile
都继承自一个基类,该基类包含来自两个子类的onCreate()
方法
名为DataManager
的Singleton
类:
public class DataManager {
private static DataManager only_instance = null;
public List<Facility> facilities;
public List<Procedure> procedures;
public static User theUser;
public DataManager(){
only_instance.theUser = new User();
}
public static DataManager getInstance(){
if(only_instance == null){
only_instance = new DataManager();
}
return only_instance;
}
}
userProfile中的onStop()方法
@Override
protected void onStop(){
super.onStop();
DataManager dm = DataManager.getInstance();
dm.theUser.<SET LOTS OF VALUES>
}
# 1 楼答案
我认为这可能是由于同步问题。所以我们应该在synchronized()关键字的帮助下使用线程安全的Singleton,如下所示:
如果您没有使用没有DataManager实例的用户,那么它不应该是静态的
有关线程安全单例的更多信息 有关更多信息,请参阅此链接
# 2 楼答案
问题是你在懒洋洋地加载你的单身汉。当你刷新你的应用程序时,它会起作用,因为你正在调用onStop并初始化你的Singleton。但在此之前,您没有加载任何单例实例(它是空的)。如果删除惰性初始化,它将起作用。改变
到
这样,你的单例实例将在类加载后立即加载。如果您不需要立即使用Singleton实例,那么延迟加载很好,但在您的情况下,您需要立即使用它
# 3 楼答案
问题实际上在于android的生命周期。出于某种原因,在userProfile类中调用onStop()函数之前,HomePage类中调用了onCreate()函数。老实说,我不知道为什么——但将onStop()改为onPause()解决了我的问题