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

时间:2017-12-27 03:26:20

标签: java android singleton

我有一个名为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>
}

3 个答案:

答案 0 :(得分:0)

问题是你懒得加载你的Singleton。当您刷新应用程序时,它会起作用,因为您正在调用onStop并初始化Singleton。但在此之前,您没有加载Singleton实例(它为null)。如果删除延迟初始化,它将起作用。变化

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实例。如果您不立即需要Singleton的实例,延迟加载很不错,但在您的情况下,您需要立即使用它。

答案 1 :(得分:0)

我假设它可能是由于同步问题。所以我们应该在下面的synchronized()关键字的帮助下使用Thread Safe Singleton:

    ASingleton result = instance;
        if (result == null) {
            synchronized (mutex) {
                result = instance;
                if (result == null)
                    instance = result = new ASingleton();
            }
        }
        return result;

如果您没有使用没有DataManager实例的用户,那么它不应该是静态的。

了解有关Thread Safe Singleton的更多信息 您可以参考此链接获取更多信息

  

https://www.journaldev.com/171/thread-safety-in-java-singleton-classes-with-example-code

答案 2 :(得分:0)

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