我有一个 android 应用程序,其中有几个活动。每个活动都会下载一个 xml/json 提要,对其进行解析并将其推送到通常作为数组列表的单例中。
然而,在经历了各种活动之后,单例似乎正在消亡,并且大多数早期下载的数组列表现在都是空的。为什么会这样?单例不是跨活动共享数据的推荐做法吗?
添加我的评论作为答案
如果要跨活动保留全局变量,请将其保留在应用程序中。从 Application 扩展一个类并将其添加到您的 AndroidManifest 文件中。
来自@rekaszeru 分享的 Android API FAQ
单例类
您可以通过使用单例来利用您的应用程序组件在同一进程中运行这一事实。这是一个设计为只有一个实例的类。它有一个名为 getInstance() 的静态方法,它返回实例;第一次调用此方法时,它会创建全局实例。因为所有调用者都获得相同的实例,所以他们可以将其用作交互点。例如,活动 A 可以检索实例并调用 setValue(3);稍后的活动 B 可能会检索实例并调用 getValue() 以检索最后设置的值。
请参阅此线程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;
}
您可以通过 Application 类进行初始化。此类存在于所有活动中。您必须在 Manifest 文件中声明它,并且具有类似于 Activity 的生命周期。
此处的文档:应用程序
希望能帮助到你。
JQcorreia