【问题标题】:How I can save a "list" of globally or at least instance it for use in any activity, in Android?如何保存全局或至少实例的“列表”以在 Android 中用于任何活动?
【发布时间】:2014-06-03 20:31:00
【问题描述】:

我创建了一个名为 Singleton 的类,其中包含一个列表和实例

public class  Singleton {
private static Singleton instance;
private List<MaterialModel> list = new ArrayList<MaterialModel>();

public Singleton(){
}

public List<MaterialModel> getList() {
    return list;
}

public void setList(List<MaterialModel> list) {
    this.list = list;
}

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

public void addElement(MaterialModel material){
    this.list.add(material);
}

public MaterialModel getElement(int pos){
    return this.list.get(pos);
}

public boolean foundElement(MaterialModel material){
    if(this.list.contains(material)){
        return true;
    }
    return false;
}


}

这个想法是将项目存储在列表中并在任何活动中获取它们。实际上,我试图让这个列表可以用于任何类型并且不会丢失其中的项目。

第一个活动

public class FirstActivity extends SherlockActivity{
    Singleton singleton;
        ...
       public onCreate(...){
       singleton.addElement(obj)); // MaterialModel obj = new MaterialModel(.....)

第二次活动

public class SecondActivity extends SherlockActivity{
        Singleton singleton;
            ...
           public onCreate(...){
           MaterialModel tmp = singleton.getElement(0)); // getElement return "obj"

问题是它不起作用,我该如何修复它或至少将列表保存在全局范围内,以便它可以在任何活动中使用

【问题讨论】:

  • 单例实例化了吗?
  • @Rod_Algonquin 我不知道...但我认为不是

标签: java android singleton instance


【解决方案1】:

我认为您不了解“单例”模式背后的想法。

首先,不要创建 public 构造函数 - 相反(如 Rod_Algonquin)建议您需要使用 static 方法(通常称为 getInstance)来返回单例的单个实例。

示例...

public class Singleton {
    private static Singleton mInstance = null;

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

    // Other code here

}

在上面的代码中,单例类拥有一个对自身单个实例的引用,即mInstance。从 mInstance 开始是 null 并且由于没有公共构造函数,因此无法使用 new Singleton() 从另一个类创建单例的新实例,但可以从单例本身中创建。

相反,每当您需要访问您的单身时使用...

Singleton.getInstance();

如果您查看getInstance() 的代码,您会看到...

if (mInstance == null)
    mInstance = new Singleton();
return mInstance;

显然getInstance() 第一次被调用mInstance 将是null,所以if 条件为真并且mInstance = new Singleton() 行将被执行。之后,该方法将返回mInstance引用的实例。

在从代码中的任何类或方法对Singleton.getInstance() 的任何后续调用中,mInstance 将已被实例化,因此if 条件将为假,但getInstance 方法仍将返回mInstance单例的单个实例。

作为额外的好处,您可以在代码中保存对单例的引用并调用诸如...之类的方法

Singleton theSingleton = Singleton.getInstance();
theSingleton.doSomething();

...或者您可以简单地使用它来链接对单例中的公共方法的调用,例如...

Singleton.getInstance().doSomething();

所以对于您的第一个 Activity,您可以这样做...

Singleton.getInstance().addElement(obj);

...第二个Activity 这样做...

MaterialModel tmp = Singleton.getInstance().getElement(0);

【讨论】:

    【解决方案2】:

    在修改其中的任何数据之前,您需要先获取 Singleton 的实例。

    示例:

    每次调用 Singleton singleton 时,都需要调用它的静态实例并在 Singleton 对象中实例化;

    Singleton singleton = Singleton.getInstance();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多