传递`Context`到处都是混乱的 - 创建类来处理与上下文的不同交互?

时间:2014-08-13 09:03:19

标签: java android android-context

有很多问题涉及Context,要使用哪种上下文,以及如何存储它等等。但每次我将它传递给一个对象,或者创建一个静态或单例提供对它的访问。我不确定我会得到什么味道,但它肯定闻起来。

我在考虑另一种方法是创建充当上下文代理的类,而不是我传递的类,它将上下文的特征的子集定义为一种接口(不是语言{{1} }关键字)。

替代方案的一个示例(为了便于阅读,省略了代码):

interface

是否存在任何与此相反的OOP原则?还是闻起来有气味?我只是无法决定。

2 个答案:

答案 0 :(得分:3)

每当将Context实例传递给另一个类时,请记住,

  

" 这个课程的实际寿命是否可能超过我传递给它的Context"

如果答案是否定的,请不要担心。如果答案是肯定的,请考虑为什么

例如,

View,如果正常使用,将永远不会超过Activity。一旦Activity收集垃圾,您的View就会收集垃圾,因此无需担心。

然而,

Singletons,的寿命更长,泄漏Context。也就是说,当Activity应该被垃圾收集时,它不会被收集,因为单身人士仍然有一个对它的引用。

我想到了几个解决方案:

  • getApplicationContext()用于单身人士。这种类型的Context只要你的申请存在,就会存在 - 因此只要你的单身人士生活。
  • 使用WeakReference s。这可确保您不会对Context保持有效参考,并避免泄漏。但是,您需要补偿Context
  • 的可能无效性

显然,要求您了解垃圾收集的基础知识。 Here's an article about that


至于您给出的示例代码,我认为传递此实例与传递实际Context无关。在这两种情况下,您都会引用Context。事实上,StateStorer类似乎是一个单身人士,而且 - 就像你做的那样 - 应该提供ApplicationContext

您还经常会看到单身人士在提供Context时,自己致电getApplicationContext()以避免此类错误:

public static MySingleton getInstance(final Context context) {
    if(sInstance == null) {
        sInstance = new MySingleton(context.getApplicationContext());
    }

    return sInstance;
}

答案 1 :(得分:0)

看起来像整洁的代码。但为什么要经历所有这些复杂的动作只是为了传递背景?现在看来你正在传递一个不同的类(你的RememberMe类),这和传递上下文一样糟糕或好。所以我没有真正看到这种优势。