有很多问题涉及Context
,要使用哪种上下文,以及如何存储它等等。但每次我将它传递给一个对象,或者创建一个静态或单例提供对它的访问。我不确定我会得到什么味道,但它肯定闻起来。
我在考虑另一种方法是创建充当上下文代理的类,而不是我传递的类,它将上下文的特征的子集定义为一种接口(不是语言{{1} }关键字)。
替代方案的一个示例(为了便于阅读,省略了代码):
interface
是否存在任何与此相反的OOP原则?还是闻起来有气味?我只是无法决定。
答案 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类),这和传递上下文一样糟糕或好。所以我没有真正看到这种优势。