android中单例的问题

时间:2012-05-16 16:54:52

标签: android singleton

我有一个Android应用程序,其中有几个活动。每个活动都下载一个xml / json feed,解析它并将其推送到一个单独的通常作为arraylist。

然而,在经历了各种活动之后,似乎单身人士正在死亡,大多数早期下载的数组列表现在都是空的。为什么会这样?是不是单独建议在各活动之间共享数据的做法?

3 个答案:

答案 0 :(得分:3)

添加我的评论作为答案

  

如果要跨活动保留全局变量,请将其保留在Application中。从Application扩展一个类并将其添加到AnddroidManifest文件中。

来自@rekaszeru分享的Android API常见问题解答

  

Singleton类

     

您可以利用您的应用程序组件这一事实   通过使用单身人士在同一过程中运行。这是一个   设计为只有一个实例的类。它有静电   返回实例的getInstance()等名称的方法;   第一次调用此方法时,它会创建全局实例。   因为所有调用者都获得相同的实例,所以他们可以将其用作   互动点。例如,活动A可以检索实例   并调用setValue(3);以后的活动B可以检索实例和   调用getValue()来检索最后一个设置值。

答案 1 :(得分:2)

请参阅此Android API FAQ的主题,在这里您一定会找到最适合您的问题的解决方案(无论您需要短期数据还是长期数据)。

单身人士用于短生命周期对象。

编辑:请记住,对于大量数据,使用数据库/结构化本地文件总是更好的主意(尽管后者在读/写时耗费大量资源)。如果您正在处理非常复杂的对象,选择SharedPreferences也可能会引起一些麻烦。

SharedPreferences存储/加载列表的示例:

// the name with which to store the shared preference
public static final String PERSON_LIST = "my.personlist";

// a sample data structure that will be stored
public static final class Person
{
    private String name;
    private int age;

    public String toString() 
    {
        return name + "|" + age;
    }

    // splits the passed String parameter, and retrieves the members
    public static Person loadPersonFromString(final String personString)
    {
        final Person p = new Person();
        final String[] data = personString.split("|");
        p.name = data[0];
        p.age = Integer.parseInt(data[1]);
        return p;
    }
}

/**
 * Saves the current list of Persons in SharedPreferences 
 * @param persons: the list to save
 */
public void savePersonList(final ArrayList<Person> persons) 
{
    final SharedPreferences prefs = PreferenceManager.
        getDefaultSharedPreferences(getApplicationContext());
    final Editor editor = prefs.edit();
    final StringBuilder builder = new StringBuilder();
    for (final Person person : persons)
    {
        if (builder.length() > 0)
            builder.append("-Person-");
        builder.append(person.toString());
    }
    editor.putString(PERSON_LIST, builder.toString());
    editor.commit();
}

/**
 * Loads the list of Persons from SharedPreferences
 * @return the loaded list
 */
public ArrayList<Person> loadPersonList()
{
    final SharedPreferences prefs = PreferenceManager.
        getDefaultSharedPreferences(getApplicationContext());
    final ArrayList<Person> persons = new ArrayList<Menu.Person>();
    final String[] array = prefs.getString(PERSON_LIST, "").split("-Person-");
    for (final String personString : array) 
    {
        if (personString.length() > 0)
            persons.add(Person.loadPersonFromString(personString));
    }
    return persons;
}

答案 2 :(得分:1)

您可以通过Application类初始化。所有活动都有这门课程。您必须在Manifest文件中声明它,并且其生命周期类似于Activity。

此处的文档:Application

希望它有所帮助。

JQcorreia