Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中不更新全局变量_Java_Android_Android 4.2 Jelly Bean - Fatal编程技术网

Java中不更新全局变量

Java中不更新全局变量,java,android,android-4.2-jelly-bean,Java,Android,Android 4.2 Jelly Bean,我的主活动上有一个公共静态变量,因此我可以从其他活动中使用它,我从活动#3中更新它,并检查它的值是否正确,但当我为ex.activity#2打开另一个活动时,它会返回以前的值,就像它没有更新一样 到目前为止,我试过: //activity#3 Main.myObject = new Object(); //returns the right (new Object's) value 及 但它返回在应用程序启动时从数据库获得的值,如果我重新打开应用程序,它将返回所选的值(因为它存储在DB中),但

我的主活动上有一个公共静态变量,因此我可以从其他活动中使用它,我从活动#3中更新它,并检查它的值是否正确,但当我为ex.activity#2打开另一个活动时,它会返回以前的值,就像它没有更新一样

到目前为止,我试过:

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

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

对变量使用“public static”修饰符

public static Object myObject = new Object;

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

您不应将
活动
视为POJO。创建
活动
的唯一方法是通过
意图
,在活动之间传递数据的唯一方法是使用意图
额外

有两种方法可以解决这个问题。扩展您的
应用程序
类,在这种情况下,变量实际上是全局的,或者创建一个基本活动类并从中扩展您的活动

扩展
应用程序
只应在无法以其他方式进行扩展时进行,因为全局变量通常是一件坏事,用于避免编写正确的代码

public BaseActivity extends Activity{

    protected object myVariableForAllActivities;

}

public MyActivity extends BaseActivity{

    myVariableForAllActivies = someValue;

}

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

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

使用单例模式

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();

你需要显示更多的代码。。。活动2和活动3等的区别是什么。。。在代码中显示。不能将活动视为POJO。不要在活动中制造任何生命周期大于活动本身的东西,否则会导致内存泄漏。我认为您可以使用类实例变量访问变量。使用您的类名访问变量。那么我应该如何创建全局变量,我可以从不同的活动中使用这些变量?要使用公共静态变量,您不需要创建,只需键入类变量:classname.variable\u name这只是一个示例,它必须是一个对象,通过变量和函数show,我可以防止创建主活动的多个实例吗?将其设置为单实例一种方式我认为主活动不能有多个实例,因为它的oncreate事件开始时类似于@Override protected void oncreate(Bundle savedInstanceState){super.oncreate(savedInstanceState);我试过了,也是这样:(我在哪里使用它不重要,对吗?实际上我在ListAdapters的onclick事件中使用了它,但我认为这不重要。从另一个活动中尝试过,仍然是相同的值在当前活动中是正确的,但在其他活动中是错误的:(无论在何处使用,对象始终是相同的。代码与上面的代码非常相似,除了ObjectName和其他与之无关的内容之外,这些都不重要,因为我发现:Java中的每个类加载器都有自己的名称空间。一个人可以通过两个或多个不同的类加载器来加载同一个类。如果这个类是单例类,那么用于加载该类的每个类加载器都有一个单例实例。“因此,在活动之间将内容存储在singleton中是不安全的,我将在SQLite DB中保存这些内容,但感谢您的帮助,因为singleton类不应嵌入任何类中,否则它必须是
公共静态类SingletonObject
SingletonObject.getInstance().setObject(new Object());// or existing object

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