Android中的静态字段

时间:2015-05-05 16:50:18

标签: java android static

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

  1. 使用静态字段来传输数据是不好的做法 活动和片段?对我来说,它比使用容易得多 意图中的额外内容。

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

    public class ApplicationLoader extends Application {
    public static volatile Context context;
        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();
        }
    }
    
  3. 所以有人可以解释一下,在哪些情况下应该在android中使用静态字段(我的意思是适用于类,如适配器,列表,上下文等)?当使用非静态字段,getter / setter时,额外的意图比静态字段更好吗?

3 个答案:

答案 0 :(得分:5)

  
      
  1. 这是不好的做法......
  2.   

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

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

这是因为Context对象的性质。这是Android中最令人困惑的事情之一。并非所有Context个对象都是相同的。从Context返回的getApplicationContext()是您申请的单身人士;但是,每个ActivityService实例都是Context的单独实例,并且是瞬态的(参见上文)。有一个很好的解释,请参阅戴夫史密斯的这篇精彩文章:http://possiblemobile.com/2013/06/context/

答案 1 :(得分:4)

  

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

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

主要的例外是,当活动在同一个应用中时,要传递的数据要么太大而不能用于额外的数据类型,要么是数据类型不能额外增加。即使这样,你最好采用更灵活的方法(例如,有一个对象缓存的静态单例管理器,你有共享数据,你可以使用额外的东西来传递ID或密钥来访问缓存)。

  

对我而言,它比在意图中使用额外内容要容易得多。

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

除此之外,太多缺乏经验的开发人员认为今天的痛苦超过“明天所有痛苦的总和”。换句话说,已经一次又一次地证明全局变量的使用会降低程序的可维护性。你现在可能不在乎。你的同事关心。你的老板在意。当你试图维护你今天写的代码时,你会关心未来。

  

什么时候我们可以将静态字段用于应用程序上下文的一点访问?

除了其他原因之外,经常使用错误的Context。只有当您知道精确 <{1}}实例时才使用Application实例,Application实例是正确Context的情况。例如,从Application创建用户界面(例如,通过LayoutInflater)经常会给您错误的结果。

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

  

在哪种情况下应该在android

中使用静态字段

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

  

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

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

答案 2 :(得分:0)

@google,

  
      
  1. 静态变量显示出意外行为。有时候它会释放内存分配,有些时候不会。所以它不可靠   extras将变量存储在bundle中,所以它可靠。

         
        
    1. 因为Context是&#34; BaseClass&#34;活动
    2.   
  2.   

非常重要请阅读此useful guideline以了解static和getter / setter。

如果有任何问题让我知道。