我有一个活动,它是整个应用程序中使用的主要活动,它有许多变量。我有另外两个活动,我希望能够使用来自第一个活动的数据。
现在我知道我可以这样做:
GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();
然而,我想要分享很多变量,其中一些可能相当大,所以我不想像上面那样创建它们的副本。
是否有一种方法可以直接获取和更改变量而不使用get和set方法?我记得在谷歌开发网站上读过一篇文章,说不建议在Android上使用这种性能。
如果你的意图是从当前Activity调用其他Activity,你应该使用intent。您可以将重点放在按需共享数据而不是持久化数据上。
However, if you really need to persist these values then you could persist them in some kind of structured text file or database on local storage. A properties file, XML file, or JSON file could store your data and be easily parsed during activity creation. Don't forget also that you have SQLite on all Android devices, so you could store them in a database table. You could also use a Map to store key-value pairs and serialize the map to local storage, but this might be too cumbersome to be useful for simple data structures.
“然而,我想分享很多
变量,有些可能是
很大,所以我不想创造
像上面这样的副本。”
这并不会产生复制(特别是对于String,但即使对象也是通过引用的值传递的,而不是对象本身,像这样的getter是可以使用的——可以说比其他方法更好使用,因为它们是常见的和易于理解的)。旧的“性能神话”,比如不使用getter和setter,仍然有一些价值,但也在文档中更新了。
但如果你不想那样做,你也可以让变量在GlobalState中为public或protected,然后直接访问它们。并且,你可以创建一个静态单例,就像Application对象JavaDoc指出的那样:
通常不需要子类化
应用程序。在大多数情况下,
静态单例也可以提供同样的功能
以更模块化的方式实现功能。
如果你的单例需要全局
上下文(例如注册
广播接收机),功能到
检索时可以给它一个Context
内部使用
Context.getApplicationContext()时
首先构造单例。
使用Intent数据是传递数据的另一种方式,但它通常用于较小的数据和简单类型。您可以传递更大/更复杂的数据,但这比使用静态单leon更复杂。不过,Application对象仍然是我个人最喜欢的在Android应用程序组件之间共享更大/更复杂的非持久性数据的对象(因为它在Android应用程序中有一个定义良好的生命周期)。
另外,正如其他人所注意到的,如果数据变得非常复杂并且需要持久化,那么您也可以使用SQLite或文件系统。
Using the hashmap of weak reference approach, described above, and in http://developer.android.com/guide/faq/framework.html seems problematic to me. How are entire entries reclaimed, not just the map value? What scope do you allocate it in? As the framework is in control of the Activity lifecycle, having one of the participating Activities own it risks runtime errors when the owner is destroyed in advance of its clients. If the Application owns it, some Activity must explicitly remove the entry to avoid the hashmap from holding on to entries with a valid key and a potentially garbaged collected weak reference. Furthermore, what should a client do when the value returned for a key is null?
在我看来,由应用程序拥有或在单例中拥有WeakHashMap是更好的选择。映射中的值是通过键对象访问的,当不存在对键的强引用时(即所有活动都使用键及其映射到的对象完成),GC可以回收映射条目。