我应该在哪里全局保留/缓存所有应用程序生命周期所需的数据?

时间:2010-11-17 09:18:57

标签: android

我在Android / Java编程方面相当新,所以一些基本的东西仍然很混乱。因此,假设我的应用程序从外部XML文件获取所需的所有数据(文章),它将它们解析为数据模型(文章类),并且将在整个应用程序中使用这些文章(在列表或单个文章中显示)的生命周期。

我应该把它们放在哪里?我可以使用包含我已解析的所有文章的数组创建单例类吗?或者我应该将它们保存到数据库,然后按需查询? (这听起来像是太多的工作,我现在不需要缓存它们)这里最好的做法是什么?

3 个答案:

答案 0 :(得分:2)

将它们保存在Application中。这是任何Android应用程序的基类,它在应用程序的整个生命周期中都处于活动状态,而活动在未显示或方向更改时被终止。

您必须在AndroidManifest.xml中声明android:name

<application android:name=".YourApplication"/>

<强>编辑:

这也是相关的:How do I pass data between Activities/Services within a single application?

答案 1 :(得分:1)

这取决于你的编程风格lol。

你可以像你说的那样创建一个能够读取xml并存储所有内容的单例。

您可以在班级中创建静态哈希。这样,当您创建新对象时,您将可以访问该类中的静态信息。

您可以将信息从类传递给类作为参数。

如果你想让我们告诉你哪一个会是最好的,那么在不了解你的程序架构的情况下会很难。

例如,您可以使用一个处理任何更改的视图控制器,然后在切换视图时将数据存储在该级别以便将其传递是很简单的。

您可以拥有静态视图,您可以在打开它们时直接设置所有值。

你可能会丢失链接的视图,这些视图在没有任何控制器的情况下相互调用来处理切换,在这种情况下,您可能更愿意从单例或静态方法中收集所需的信息......

答案 2 :(得分:0)

只要确保没有任何线程作用于共享数据,您就可以创建一个包含静态成员的静态类。每个活动都可以访问它。如果对数据使用异步下载,那么在处理程序的onPostExecute中,您可以触摸GlobeVars,因为它在UI线程上运行。

public class GlobalVars {
  public static String userId = "?";
  //public static String serverUrl = "10.0.2.2"; //localhost when developing
  public static String serverUrl = "192.168.1.4"; //on device to laptop
  //public static String serverUrl = "102.192.293.10"; //production
  public static Book currentBook = null;
  public static Chapter currentChapter = null;
  public static int lastclickedChapter = -1;
  public static Voice currentVoice = null;
  public static String catalogJson = "";
  public static ArrayList<Book> catalogItems = null;
}

onCreate of MainActivity我可以将目录设置为我下载的xml转换为对象的列表

GlobeVars.catalogItems = downloaded xml to object list

在我的SubActivity中,这是我可以设置的onclicklistener中的章节列表:

GlobeVars.currentChapter = items[clickeditem];

当您返回主活动时,仍会设置值。