3

我创建了像这样扩展应用程序的类

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" >

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

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

当尝试使用它时它会因空异常而崩溃,我在另一个活动或类似的类中使用它

    GlobalVariables appState = new GlobalVariables();

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

请问有什么遗漏吗,怎么解决

4

4 回答 4

4

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

如果你真的想要一个全局变量,它应该是一个静态变量——但即使这样也只有在同一进程中的活动之间共享数据时才有效。您应该阅读Android 应用程序框架常见问题解答以获取更多信息。

于 2012-06-11T07:51:11.977 回答
3

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

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);
于 2012-06-11T07:58:27.640 回答
2

您可以制作提供一个对象实例的单例 ([http://en.wikipedia.org/wiki/Singleton_pattern]) 类。并在此类中创建可验证的 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();
}
}
于 2012-06-11T08:04:18.087 回答
1

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

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

GlobalVariables appState = (GlobalVariables) getApplication();

Encounter EncounterObject = appState.encounters.get(position);
于 2012-06-11T08:12:04.703 回答