2015-05-05 85 views
7

我是android和java开发中的新手,我想了解一些东西。Android中的静态字段

  1. 它是不好的做法,使用静态字段传输数据 活动与片段之间?对我而言,这比在意图中使用 临时演员要容易得多。

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

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

所以有人可以解释,在这种情况下应该使用安卓(我的意思是类如适配器,列表,背景等)的静态字段?当使用非静态字段,getters/setters时,额外的意图是更好的方式,然后静态字段?

+3

因为全球国家是纯粹的邪恶。事实上,如果你谷歌这句话,第一个链接给出了一个很好的解释。 – Ordous

回答

3

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

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

主要的例外是,当活动在同一个应用程序中要传递的数据太大而无法进入额外的数据类型或不能进入额外的数据类型。即使这样,你最好用更灵活的方法(例如,有一个对象缓存的静态单例管理器,你拥有共享数据,在这里你使用extras传递ID或密钥来访问缓存)。

对我来说,这比在意图中使用临时演员要容易得多。

您不使用附加功能从活动传递到片段,反之亦然。至多,您可以使用额外功能作为活动之间传递数据的一部分。

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

当我们可以使用静态字段来访问一个应用程序上下文吗?

除了其他原因之外,常常会使用错误的Context。仅当使用Application实例时,您知道正好是为什么使用Application实例是正确的Context为情况。例如,从Application(例如,通过LayoutInflater)创建用户界面通常会给您提供错误的结果。

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

在哪些情况下应使用静态字段的Android

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

我的意思是类如适配器,列表,背景等

假设由“名单”你的意思是ListView,使用静态数据成员不适合如有此种情况,恕我直言。

5
  1. 它是不好的做法...

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

  • 为什么许多程序使用上下文...
  • 这是因为Context对象的性质。这是Android中最令人困惑的事情之一。并非所有Context对象都是相同的。从getApplicationContext()返回的Context是您的应用程序的单例;但是,每个ActivityService实例都是Context的单独实例,并且是瞬态的(请参见上文)。对于一个伟大的解释,看到戴夫·史密斯这篇大文章:http://possiblemobile.com/2013/06/context/

    +0

    请注意,您应该永远不要尝试访问来自其他活动的活动中的某些内容,并在活动中使某些内容静态化,否则会导致内存泄漏。 – Simon

    0

    @google,

    1. 静态变量显示你意想不到的behavior.Some时候,它是免费的内存分配和一定的时间不是。所以它不可靠,而 额外存储变量捆绑,所以它可靠。

    2. 因为上下文是活动
    的 “BaseClass的”

    的和非常重要阅读本useful guideline使用静态和吸气/设定器的。

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