我可以将ArrayList<HashMap<String, String>>
保留在捆绑包中吗?
我希望在旋转屏幕后立即显示ListView
。
答案 0 :(得分:3)
您无需将其保存在Bundle
中。事实上,这似乎是存储在Bundle
中的大量信息。
由于您只是保存HashMap
String
个static
个对象,因此您可以创建一个类来为您缓存它或使其成为类中的Activity
字段。
静态字段可以使用,只要它们不包含对View
或Drawable
或private static HashMap<String,String> myMap = new HashMap<String,String>();
的引用即可。 (这可能导致内存泄漏)
最简单的方法可能就是:
static
由于此字段为{{1}},因此在重新创建活动时不会重新创建该字段。相反,它仍然可以使用相同的值。
更多存储数据的方式:
(这些技术也适用于通过配置更改共享数据)。
http://developer.android.com/guide/faq/framework.html#3
如何在单个应用程序中的活动/服务之间传递数据?
这取决于您要共享的数据类型:
原始数据类型
在应用程序中的活动/服务之间共享原始数据, 使用Intent.putExtras()。用于传递需要的原始数据 坚持使用首选项存储机制。
非持久对象
简而言之,用于共享复杂的非持久性用户定义对象 持续时间,建议采用以下方法:
单身人士课程
您可以利用您的应用程序组件这一事实 通过使用单身人士在同一过程中运行。这是一个 设计为只有一个实例的类。它有静电 返回实例的getInstance()等名称的方法; 第一次调用此方法时,它会创建全局实例。 因为所有调用者都获得相同的实例,所以他们可以将其用作 互动点。例如,活动A可以检索实例 并调用setValue(3);以后的活动B可以检索实例和 调用getValue()来检索最后一个设置值。公共静态 场/方法
使活动/服务之间的数据可访问的另一种方法是 使用公共静态字段和/或方法。你可以访问这些 来自应用程序中任何其他类的静态字段。分享一个 对象,创建对象的活动设置静态字段 指向此对象以及要使用此对象的任何其他活动 object只访问这个静态字段。
WeakReferences to Objects的HashMap
您还可以使用WeakReferences的HashMap与Long对象 键。当一个活动想要将一个对象传递给另一个活动时,它就是 只需将对象放入地图并发送密钥(这是唯一的 基于计数器或时间戳的长期通过收件人活动 意图额外。收件人活动使用此检索对象 键。
持久对象
即使应用程序似乎继续运行,系统也可能 选择终止其进程并稍后重新启动它。如果你有数据 你需要从一个活动调用到下一个活动调用 将该数据表示为活动在其中保存的状态 被告知它可能会消失。
用于共享复杂的持久性用户定义对象,如下所示 建议使用方法:
- 应用程序首选项
- 文件
- contentProviders
- SQLite DB
如果共享数据需要保留在哪些点之间 可以杀死应用程序进程,然后将该数据置于持久性状态 存储,如应用程序首选项,SQLite数据库,文件或 ContentProviders。有关更多详细信息,请参阅数据存储 关于如何使用这些组件。
答案 1 :(得分:0)
您可能应该重写活动或片段onSaveInstanceState(Bundle)函数。这将允许您设置要在同一活动或片段的实例之间保存的任何数据。这是在旋转之间进行保存的正确方法。
**更新**
由于您有一个包含一个或多个Hashmaps的ArrayList,您可能需要将两个对象保存到该包中。一个是数组中的HashMaps数,然后是每个HashMap。由于HashMaps是Serializable,您可以使用Bundle.putSerializable将每个HashMaps放入bundle中。您需要将所需信息放入bundle中,以便在OnResume()中重新创建ArrayList。
一种方法可能就是这样:每个HashMap的键都是“Hashmap1”,“Hashmap2”等字符串,每个HashMap都是如此。然后,如果您知道要从包中检索的HashMaps的数量和密钥格式,则可以重新创建ArrayList。