ArrayList作为全局变量

时间:2012-06-11 07:49:00

标签: java android

我创建了类似于

的应用程序扩展的类
package com.appnetics;

import java.util.ArrayList;

import android.app.Application;

public class GlobalVariables extends Application {

    public ArrayList<Encounter> encounters;

}

并将其设置为像这样的表现者

<application
android:name="GlobalVariables"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

在一个Actiity中,我使用此代码填充此数组

GlobalVariables appState = new GlobalVariables();
appState.encounters =new ArrayList<Encounter>(); 
................
then add 

当尝试使用它时会崩溃并出现null异常,我会在其他活动或类中使用它

    GlobalVariables appState = new GlobalVariables();

    Encounter EncounterObject = appState.encounters.get(position);

请问有什么遗失,如何解决

4 个答案:

答案 0 :(得分:4)

它是GlobalVariables类的实例变量,因此每次创建GlobalVariables的新实例时,您和#39;将获得一个单独的变量。

如果确实想要一个全局变量,那么它应该是一个静态变量 - 但即便如此,只有当您在其中的活动之间共享数据时才会这样做。同样的过程。您应该阅读Android Application Framework FAQ以获取更多信息。

答案 1 :(得分:3)

我会在这里使用Singleton模式。 Wikipedia link

public class GlobalVariables {
  public ArrayList<Encounter> encounters;

  private GlobalVariables() {
    encounters = new ArrayList<Encounter>();
  }

  private static GlobalVariables instance;

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

然后您可以使用以下方式访问您的数据:

GlobalVariables.getInstance().encounters.get(position);

答案 2 :(得分:2)

您可以制作提供一个对象实例的singleton([http://en.wikipedia.org/wiki/Singleton_pattern])类。并在此类中创建可验证的ArrayList。你可以在任何你想要的地方访问这个arraylist。 例如单身人士类:

public class Singleton {

private ArrayList<Object> arrayList;

private static Singleton instance;

private Singleton(){
    arrayList = new ArrayList<Object>();
}

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

public ArrayList<Object> getArrayList() {
    return arrayList;
}
}

在活动中使用:

public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Singleton.getInstance().getArrayList();
}
}

答案 3 :(得分:1)

您每次都通过调用构造函数来创建一个新的应用程序对象,而不是通过方法getApplication()获取应用程序引用。因此,您应该将代码编辑为:

GlobalVariables appState = (GlobalVariables) getApplication();
appState.encounters =new ArrayList<Encounter>(); 
................
then add 

GlobalVariables appState = (GlobalVariables) getApplication();

Encounter EncounterObject = appState.encounters.get(position);