【发布时间】:2013-03-25 10:35:35
【问题描述】:
在一个 Android Activity 中,我正在填充一个 ArrayList,它在该 Activity 中被声明为静态。 该数据结构稍后在应用程序执行期间被其他活动访问,如下所示:
类名.data_structure_name;
我的问题是这样做是否安全,或者 Android 是否可以清除内存结构或类似的东西?
【问题讨论】:
标签: android
在一个 Android Activity 中,我正在填充一个 ArrayList,它在该 Activity 中被声明为静态。 该数据结构稍后在应用程序执行期间被其他活动访问,如下所示:
类名.data_structure_name;
我的问题是这样做是否安全,或者 Android 是否可以清除内存结构或类似的东西?
【问题讨论】:
标签: android
是的,Android 可以按照here 的说明处理您的Activity。
如果某个活动被暂停或停止,系统可以将其从 内存 要么通过要求它完成(调用它的finish() 方法),要么 简单地杀死它的进程。当活动再次打开时(之后 被完成或被杀死),它必须被重新创建
但是这是针对Activity 实例的。如果您的 ArrayList 是静态的,那么除非从 Dalvik VM 卸载 Activity 类(我个人从未见过这种情况),否则它不会被删除。
无论如何,恕我直言,这不是一个好的设计(我过去曾使用过)。我建议你使用一个单独的类来存储你的静态ArrayList。请注意多线程和the cons of using Singletons。
【讨论】:
如果你需要你的 ArrayList 被不同的活动访问,我认为你应该把它放在一个单独的类中 - 而不是一个 Activity 类。
【讨论】:
如果您想知道,数据不会在不同的进程中持续存在,因此您可能只会遇到错误。 IE,类的静态成员不是持久存储。
但是,如果您以后的这些活动在同一个流程中,那么您将能够像您指定的那样访问它。
【讨论】:
这个设计有几个问题。
我猜你从某个来源获取数据并将其放入数组列表中。如果您不需要整个数组列表,只需在包中传递值即可。
如果您在后续活动中需要整个数组列表,请按照您最初获得的方式重新填充数组列表。
静态访问不适合 OOP 设计。除了以下打印日志标签的情况外,我不会在我的 Android 应用程序的任何地方使用静态。
public static final String TAG="MY_TAG";
即使是 Singleton 也值得商榷。
【讨论】:
TAG 声明中忘记了final ;)
Activity instances 无关。他的所有Activity 实例都可以被销毁,并且字段值将被保留。