【问题标题】:Static fields in AndroidAndroid中的静态字段
【发布时间】:2015-07-15 12:47:46
【问题描述】:

我是 android 和 java 开发的新手,我想了解一些事情。

  1. 使用静态字段在 活动和片段?对我来说,它比使用容易得多 意图中的额外内容。

  2. 为什么很多程序在构造函数和方法中使用上下文作为参数? 可以使用静态字段对应用程序上下文进行单点访问吗? 例如:

    public class ApplicationLoader extends Application {
    public static volatile Context context;
        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();
        }
    }
    

那么有人可以解释一下,在哪些情况下应该在 android 中使用静态字段(我的意思是用于适配器、列表、上下文等类)?当使用非静态字段、getter/setter 时,intent 中的额外方法比静态字段更好?

【问题讨论】:

  • 因为全局状态是纯粹的邪恶。事实上,如果你用谷歌搜索那个短语,第一个链接给出了很好的解释。

标签: java android static


【解决方案1】:
  1. 这是不好的做法吗...

是的。 ActivityFragment 是瞬态对象。他们来来去去的需求。对于Activity,它会在需要时由框架自动创建。您的应用程序可以同时创建同一Activity 类的多个实例,具体取决于您设计应用程序的方式以及用户任务/返回堆栈的状态。在这些情况下,static 跟踪单个 Context 会破坏应用程序中的内容。

  1. 为什么许多程序使用上下文...

这是因为Context 对象的性质。这是Android中最令人困惑的事情之一。并非所有 Context 对象都是平等创建的。从getApplicationContext() 返回的Context 是您的应用程序的单例;但是,每个ActivityService 实例都是Context 的单独实例并且是瞬态的(见上文)。有关详细说明,请参阅 Dave Smith 的这篇精彩文章:http://possiblemobile.com/2013/06/context/

【讨论】:

  • 还请注意,您永远不应该尝试从另一个活动访问活动中的某些内容,并且在活动中将某些内容设为静态可能会导致大量内存泄漏。
【解决方案2】:

@google,

  1. 静态变量向您展示了意想不到的行为。有时它会释放内存分配,有时则不会。所以它不可靠 extras 将变量存储在 bundle 中,所以它是可靠的。

    1. 因为 Context 是 Activity 的“BaseClass”

并且非常重要阅读此useful guideline 以了解静态和 getter/setter 的使用。

如果有任何问题,请告诉我。

【讨论】:

    【解决方案3】:

    使用静态字段在活动和片段之间传输数据是不好的做法吗?

    一般来说,是的。使用静态数据成员当然有 Android 模式,但对于“传输数据”,它们很少使用,因为所有经典原因,全局变量在大多数编程语言中被认为是不良形式。

    主要的例外是当活动在同一个应用程序中时要传递的数据要么太大而不能进入额外的,要么是不能进入额外的数据类型。即便如此,您最好还是采用更灵活的方法(例如,拥有一些对象缓存的静态单例管理器,在其中您拥有共享数据,您可以在其中使用额外的 ID 或密钥来访问缓存)。

    对我来说,这比在意图中使用额外内容要容易得多。

    您不使用附加功能从活动到片段进行通信,反之亦然。最多,您使用 extras 作为活动之间传递数据的一部分。

    除此之外,太多缺乏经验的开发人员更看重今天的痛苦,而不是“明天所有痛苦的总和”。换句话说,全局变量的使用已经一次又一次地被证明会随着时间的推移降低程序的可维护性。你现在可能不在乎。你的同事关心。你的老板在乎。当您尝试维护您今天编写的代码时,您将关心的未来。

    我们什么时候可以使用静态字段对应用程序上下文进行单点访问?

    除其他原因外,经常使用错误的Context。只有当您知道确切地为什么使用Application 实例是正确的Context 时,才使用Application 实例。例如,从 Application(例如,通过 LayoutInflater)创建 UI 经常会给您带来错误的结果。

    This epic blog post by Dave Smith 有助于概述不同类型的Context 的角色。

    在哪些情况下应该在android中使用静态字段

    尽可能避免使用它们。在需要时谨慎使用它们。请记住,当您的应用程序不在前台时,您的进程可以随时终止,因此如果您不想丢失这些数据,静态数据成员需要成为以持久方式存储的数据的缓存。

    我的意思是适配器、列表、上下文等类

    假设您所说的“列表”是指 ListView,恕我直言,使用静态数据成员不适合任何这些情况。

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多