ArrayList作为全局变量

我创建了类似于应用程序扩展的类

package com.appnetics; import java.util.ArrayList; import android.app.Application; public class GlobalVariables extends Application { public ArrayList encounters; } 

并将它设置为这样的表现forms

  

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

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

当试图使用它时崩溃与nullexception,我在另一个活动或类中使用它

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

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

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

如果你真的想要一个全局变量,那么它应该是一个静态变量 – 但即便如此,只有在同一进程中的活动之间共享数据时才会起作用。 您应该阅读Android应用程序框架FAQ以获取更多信息。

我会在这里使用Singleton模式。 维基百科链接

 public class GlobalVariables { public ArrayList encounters; private GlobalVariables() { encounters = new ArrayList(); } private static GlobalVariables instance; public static GlobalVariables getInstance() { if (instance == null) instance = new GlobalVariables(); return instance; } } 

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

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

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

 public class Singleton { private ArrayList arrayList; private static Singleton instance; private Singleton(){ arrayList = new ArrayList(); } public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } public ArrayList 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(); } } 

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

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

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