全局变量未在Java中更新

时间:2015-01-04 13:25:42

标签: java android android-4.2-jelly-bean

我在Main活动中有一个公共静态变量,所以我可以在其他活动中使用它,我从活动#3更新它并检查它的值,它没关系,但是当我打开前者的另一项活动。活动#2它返回之前的值,因为它没有更新。

我到目前为止尝试过:

//activity#3
Main.myObject = new Object();
//returns the right (new Object's) value

Main.setMyObject(new Object());
Log.i("test", Main.myObject.Name()); //returns the right (new Object's) value

//activity#2
Log.i("test", Main.myObject.Name()); //returns the wrong (previous) value

但它返回它在应用程序启动时从数据库获得的值,如果我重新打开应用程序它返回所选值(因为它存储在DB中),但无法在运行时获得正确的值。

6 个答案:

答案 0 :(得分:1)

使用单例模式

class SingletonObject{
        private static SingletonObject instance;
        private Object object;
        private SingletonObject(){
            object = new Object();
        }

        public static synchronized SingletonObject getInstance() {
            if (instance == null){
                instance = new SingletonObject();
            }
            return instance;
        }

        public Object getObject() {
            return object;
        }

        public void setObject(Object object) {
            this.object = object;
        }
    }

用法

SingletonObject.getInstance().setObject(new Object());// or existing object

                Object object = SingletonObject.getInstance().getObject();

答案 1 :(得分:0)

为变量使用“public static”修饰符。

public static Object myObject = new Object;

答案 2 :(得分:0)

看起来在两个活动中主要对象是不同的。我的意思是活动3具有与活动2中的主要对象不同的主要对象的参考

答案 3 :(得分:0)

您永远不应将Activity视为POJO。创建Activity的唯一方法是通过Intent,在活动之间传递数据的唯一方法是使用intent Extra

有两种方法可以解决这个问题(其中包括)。扩展您的Application类,在这种情况下,变量确实是全局的,或者创建一个基本活动类并从中扩展您的活动。

扩展Application只有在你不能以任何其他方式完成时才应该这样做,因为全局变量通常是一件坏事并且用来避免编写正确的代码。

public BaseActivity extends Activity{

    protected object myVariableForAllActivities;

}

public MyActivity extends BaseActivity{

    myVariableForAllActivies = someValue;

}

答案 4 :(得分:0)

您可能希望在任何其他活动之外的应用程序中创建单例。该单例将返回到每个应用程序,并且将是相同的,它可以将您的对象存储在其中:

class Config {
  private Config singleton;
  private Config() {}
  public static Config getInstance() {
    if (singleton != null) return singleton;
    singleton = new Config();
    return singleton;
  }
}

答案 5 :(得分:-1)

你描述的问题相当抽象,我会尝试一些假设的答案,看看我是否做对了。 通过活动,我认为你引用线程。通过主要活动我理解主线程。 但是,如果Main是具有public属性的特定类型的Object,并且该对象可由不同的线程访问,那么您必须控制这些线程对其状态(属性)的访问。 此外,如果主要对象通过复制而在线程之间传递,而不是引用它,那么您再次遇到获取先前对象的问题。 我的回答是不使用公共属性,没有实际的好处。将私有属性与getter和setter一起使用。这样你就可以: - 来自不同线程的同步访问; - 使用新值初始化在一个地方(设置者)完成。