有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android单例类仅在第二次刷新时更新

我有一个名为DataManager的单例类。当我在一个名为userProfile的类(activity)中调用onStop()时,我更新了DataManager中的一些数据。它从一些文本输入框中获取值,并更新DataManger中的User对象。我用BottomNavigationView浏览我的应用程序,所以当我从userProfile视图中按下home图标时,我应该调用userProfile{}并更新值。这是正确的。我逐步完成了代码,我的singleton类中的值被正确更新。当我试图从主页上读取这些值时,就会出现问题。这些值尚未更新。但是如果我重新打开视图或打开另一个视图,DataManager中的值就是正确的更新值。你认为问题是什么

我不确定它是否相关,但是home和userProfile都继承自一个基类,该基类包含来自两个子类的onCreate()方法

名为DataManagerSingleton类:

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

共 (3) 个答案

  1. # 1 楼答案

    我认为这可能是由于同步问题。所以我们应该在synchronized()关键字的帮助下使用线程安全的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

  2. # 2 楼答案

    问题是你在懒洋洋地加载你的单身汉。当你刷新你的应用程序时,它会起作用,因为你正在调用onStop并初始化你的Singleton。但在此之前,您没有加载任何单例实例(它是空的)。如果删除惰性初始化,它将起作用。改变

    if(only_instance == null){ //This is called "lazy loading"
        only_instance = new DataManager();
    }
    

    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实例,那么延迟加载很好,但在您的情况下,您需要立即使用它

  3. # 3 楼答案

    问题实际上在于android的生命周期。出于某种原因,在userProfile类中调用onStop()函数之前,HomePage类中调用了onCreate()函数。老实说,我不知道为什么——但将onStop()改为onPause()解决了我的问题