Android 数组中的数据不是';t坚持

Android 数组中的数据不是';t坚持,android,arrays,orientation,Android,Arrays,Orientation,在我的Android活动中,我使用两种不同的数组。首先,我声明它们,然后在onCreate()方法中实例化它们。但是,当我填充它们,然后更改方向时,它们会在中再次实例化,并且数据会丢失 public class MainActivity extends Activity { private JSONArray first; private JSONArray second; protected void onCreate(Bundle savedInstanceSta

在我的Android活动中,我使用两种不同的数组。首先,我声明它们,然后在
onCreate()
方法中实例化它们。但是,当我填充它们,然后更改方向时,它们会在中再次实例化,并且数据会丢失

public class MainActivity extends Activity {

    private JSONArray first;
    private JSONArray second;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        interestedSections = new JSONArray();
        productsBought = new JSONArray();
    }

        //...
}

在初始化数组之前,我尝试添加
if(savedInstanceState!=null)
,以便仅第一次初始化它们,但是当我更改方向时,它们是
null
。为了在整个应用程序生命周期中保持阵列中的数据,我可以做些什么?

请查看此答案,因为屏幕旋转时调用了onCreate:


编辑:如果您想要一种快速而肮脏的方式使其工作,只需使用一个静态初始化布尔值,并在创建时将其设置为true。如果initialized为true,则不要将数组设置为新数组。

我必须将数组声明为
static
,并且在
onCreate()
方法中,我仅第一次初始化它们:

公共类MainActivity扩展了活动{

private static JSONArray first;
private static JSONArray second;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
        first = new JSONArray();
        second = new JSONArray();
    }
}

    //...
}

请参见,这是您应该将阵列保存到捆绑包的地方


顺便说一句,Android有时可以终止进程并在以后恢复活动;静态变量将无法生存。

破解和解决方法!一个额外的变量,只是为了告诉您某个东西是否已初始化?如果(thing==null)发生了什么事?@Simon这只是理论上的,但是如果变量可以在(“第一次”)初始化期间设置为null呢?遗憾的是,您确实需要一个静态变量来检查初始化。解决此问题的最佳方法是按照链接,将“onconfigchanges”位添加到程序中的每个活动中,因为我假设您一开始不希望它这样做。愚蠢的Android及其可怕的默认行为。你是指应用程序生命周期还是活动生命周期?我这样问是因为如果它们在您旋转时为null,那么它们将在您的活动中声明,因此仅在该活动的范围内。很高兴您修复了它,但它们不需要是静态的,如果您将值传递到其他任何地方,则绝对不应该是静态的。不过我真的很困惑。您可以声明
first
second
以及initiailse
感兴趣的部分
productsbound
。你在哪里初始化第一个和第二个?如果我不将它们声明为静态,当我更改方向时,它们将为
null
。如果你可以等待几个小时(现在工作),我将完全响应。您可能引入了一个大内存泄漏。我想你还没有完全理解发生了什么。但是如果数组没有清空,内存泄漏就会发生,不是吗?每次用户单击特定按钮时,我都会清除这两个数组