【问题标题】:Static ArrayList on Android activityAndroid活动上的静态ArrayList
【发布时间】:2013-03-25 10:35:35
【问题描述】:

在一个 Android Activity 中,我正在填充一个 ArrayList,它在该 Activity 中被声明为静态。 该数据结构稍后在应用程序执行期间被其他活动访问,如下所示:

类名.data_structure_name;

我的问题是这样做是否安全,或者 Android 是否可以清除内存结构或类似的东西?

【问题讨论】:

    标签: android


    【解决方案1】:

    是的,Android 可以按照here 的说明处理您的Activity

    如果某个活动被暂停或停止,系统可以将其从 内存 要么通过要求它完成(调用它的finish() 方法),要么 简单地杀死它的进程。当活动再次打开时(之后 被完成或被杀死),它必须被重新创建

    但是这是针对Activity 实例的。如果您的 ArrayList 是静态的,那么除非从 Dalvik VM 卸载 Activity 类(我个人从未见过这种情况),否则它不会被删除。

    无论如何,恕我直言,这不是一个好的设计(我过去曾使用过)。我建议你使用一个单独的类来存储你的静态ArrayList。请注意多线程和the cons of using Singletons

    Thisthis SO 问题也值得一读。

    【讨论】:

      【解决方案2】:

      如果你需要你的 ArrayList 被不同的活动访问,我认为你应该把它放在一个单独的类中 - 而不是一个 Activity 类。

      【讨论】:

        【解决方案3】:

        如果您想知道,数据不会在不同的进程中持续存在,因此您可能只会遇到错误。 IE,类的静态成员不是持久存储。

        但是,如果您以后的这些活动在同一个流程中,那么您将能够像您指定的那样访问它。

        【讨论】:

        • 我不认为这是这里要问的问题。
        【解决方案4】:

        这个设计有几个问题。

        1. 打破软件工程和 OOP 的规则
        2. 你也违反了 MVC 设计模式的规则
        3. 当您的活动不需要时,它会占用内存

        我猜你从某个来源获取数据并将其放入数组列表中。如果您不需要整个数组列表,只需在包中传递值即可。

        如果您在后续活动中需要整个数组列表,请按照您最初获得的方式重新填充数组列表。

        静态访问不适合 OOP 设计。除了以下打印日志标签的情况外,我不会在我的 Android 应用程序的任何地方使用静态。

        public static final String TAG="MY_TAG";
        

        即使是 Singleton 也值得商榷。

        【讨论】:

        • 我需要整个数组。您是否建议向 Web 服务器发出新请求并重新填充阵列?!更多的数据流量,更多的用户等待时间.. 似乎不是一个好主意,对吧?
        • 如果您是从 Web 源获取它,则使用持久性存储在内部将其缓存一段时间。每次读取数据时都会与存储时间进行比较。如果太旧,请再次从 Web 服务器获取数据并更新时间和数据。您假设使用非 UI 线程进行网络操作。确保每次向 Web 服务器发出请求时,旧请求都没有挂起。例如,如果您的请求是 onCreate 每次用户旋转屏幕时,您最终都会发出新请求。
        • “当你的活动不需要时它会占用内存” - false,这是一个静态成员。而你在TAG 声明中忘记了final ;)
        • 第 3 点说的是你在回答中解释的内容。
        • 并非如此。这是一个静态成员(类成员),与Activity instances 无关。他的所有Activity 实例都可以被销毁,并且字段值将被保留。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多