Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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 为什么每次调用OnCreate后都会重置计数器?_Java_Android_Variables_Button_Increment - Fatal编程技术网

Java 为什么每次调用OnCreate后都会重置计数器?

Java 为什么每次调用OnCreate后都会重置计数器?,java,android,variables,button,increment,Java,Android,Variables,Button,Increment,这是我当前的代码 public class ButtonActivity extends Activity { int count = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button b

这是我当前的代码

public class ButtonActivity extends Activity {
    int count = 0; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                button.setText("Got Pressed:" + ++count);
                }
        });
    }
}

我的问题是,为什么每次调用onDestroy()和后续调用onCreate()后,计数都会重置。我查看了onDestroy()并看到“这是为了让你的应用程序在活动被销毁之前有最后的机会清理东西,但这并不意味着活动将被调用”我最初的想法是count是一个实例变量,onCreate()创建了我的类ButtonActivity的一个新实例。有人能证实或反驳我最初的想法吗?

如果你不想让它复位-让它成为
static
:当前计数器是每个对象的

如果你不想让它复位-让它成为
static
:当前计数器是每个对象的

计数
static可以解决你的问题。(因为静态成员不属于特定实例)

但更准确地说:
onCreate
不要创建活动的新实例。事实上:Android操作系统创建了一个新实例,并通过调用
onCreate(…)
为您提供了初始化它的机会

而且,更一般地说:您可以确保
onCreate()
不会在同一实例上被调用两次:如果您看到
onCreate()
被调用,那是因为Android操作系统刚刚创建了一个新的活动实例(可以出于许多原因,比如屏幕旋转,…)


更多关于活动生命周期的信息(可能是进行Android开发时需要了解的最重要概念之一!)

使
count
静态将解决您的问题。(因为静态成员不属于特定实例)

但更准确地说:
onCreate
不要创建活动的新实例。事实上:Android操作系统创建了一个新实例,并通过调用
onCreate(…)
为您提供了初始化它的机会

而且,更一般地说:您可以确保
onCreate()
不会在同一实例上被调用两次:如果您看到
onCreate()
被调用,那是因为Android操作系统刚刚创建了一个新的活动实例(可以出于许多原因,比如屏幕旋转,…)


更多关于活动生命周期的信息(可能是进行Android开发时需要了解的最重要的概念之一!)

如本文所述,在活动类中存储静态数据是一种不好的做法 应该避免

为什么?

因为Android可能会破坏后台活动及其静态数据 每当它感到资源不足时。因此,您可以在活动中声明静态字段,但无法获得您想要的静态行为

您可以做些什么:

备选案文1:

创建一个自定义应用程序类并将静态数据放在那里。你会 甚至不必将其声明为静态,因为应用程序obj是单例的,并且 保证在应用程序处于活动状态时一直保留在内存中

public class MyApplication extends Application {
    private DataClass mydata;

    // probably with a getter & setter
}
请记住在清单中声明您的活动:

<application
        android:name="mypackage.MyApplication"  <--------
        .....

。这就是它们的用途。

如本文所建议的,在活动类中存储静态数据是一种不好的做法 应该避免

为什么?

因为Android可能会破坏后台活动及其静态数据 每当它感到资源不足时。因此,您可以在活动中声明静态字段,但无法获得您想要的静态行为

您可以做些什么:

备选案文1:

创建一个自定义应用程序类并将静态数据放在那里。你会 甚至不必将其声明为静态,因为应用程序obj是单例的,并且 保证在应用程序处于活动状态时一直保留在内存中

public class MyApplication extends Application {
    private DataClass mydata;

    // probably with a getter & setter
}
请记住在清单中声明您的活动:

<application
        android:name="mypackage.MyApplication"  <--------
        .....

。这就是他们的目的。

我就是这么想的。Thx So OnCreate创建了ButtonActivity的新实例?很难说代码是否像Button Activity a=new ButtonActivity()那样直截了当,我就是这么想的。Thx So OnCreate创建了ButtonActivity的新实例?很难说代码是否像按钮活动a=new ButtonActivity()那样,在生命周期中做了很多笔记,重要的:)在生命周期中做了很多笔记,重要的:)