Android - Singleton Class仅在第二次刷新时更新

实践是知识的母亲,知识是生活的明灯。这篇文章主要讲述Android - Singleton Class仅在第二次刷新时更新相关的知识,希望能为你提供帮助。
我有一个名为DataManager的单例类。当我在一个名为DataManager的类(onStop())中调用activity时,我更新了userProfile中的一些数据。它从一些文本输入框中获取值并更新User中的DataManger对象。我用BottomNavigationView浏览我的应用程序 - 所以当我按下userProfile视图中的主页图标时,我应该调用userProfile onStop()并更新值。这工作正常。我逐步完成了代码,我的singleton类中的值正确更新。当我尝试从主页读取值时会发生此问题。这些值尚未更新。但是,如果我重新打开视图或打开另一个视图,DataManager中的值是正确的更新值。您认为这个问题是什么?
我不确定它是否相关,但是home和userProfile都继承自一个基类,它保存了两个子类中的onCreate()方法。
Singleton类称为DataManager

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

答案问题是你懒得加载你的Singleton。它可以在您刷新应用程序时起作用,因为您正在调用onStop并初始化Singleton。但在此之前,您没有加载Singleton实例(它为null)。如果删除延迟初始化,它将起作用。更改
if(only_instance == null){ //This is called "lazy loading" only_instance = new DataManager(); }

【Android - Singleton Class仅在第二次刷新时更新】
private static final DataManager only_instance = new DataManager(); //you can optionally add final here if you're removing lazy loading. In fact, it's probably best practice to do so.public List< Facility> facilities; public List< Procedure> procedures; public static User theUser; public DataManager(){ only_instance.theUser = new User(); }public static DataManager getInstance(){ return only_instance; }

这样,只要加载类,就会加载Singleton实例。如果您不需要立即使用Singleton实例,则延迟加载很好,但在您的情况下,您需要立即使用它。
另一答案我假设它可能是由于同步问题。所以我们应该在synchronized()关键字的帮助下使用Thread Safe Singleton,如下所示:
ASingleton result = instance; if (result == null) { synchronized (mutex) { result = instance; if (result == null) instance = result = new ASingleton(); } } return result;

如果你没有使用没有DataManager实例的用户,那么它不应该是静态的。
有关线程安全单例的更多信息您可以参考此链接以获取更多信息
https://www.journaldev.com/171/thread-safety-in-java-singleton-classes-with-example-code
另一答案问题实际上在于android生命周期。出于某种原因,在userProfile类中调用onStop()函数之前,在主页类中调用了onCreate()函数。老实说,我并不完全是为什么 - 但将onStop()改为onPause()解决了我的问题。

    推荐阅读