在我的ArrayAdapter类中,我捕获传入的上下文。然后在getView方法中,我有这个if语句:
if(m.getSide() == RED) {
v.setBackgroundColor(lc.getResources().getColor(R.color.red_bouy));
Log.d("MA", "HERE");
} else if(m.getSide() == BLACK) {
v.setBackgroundColor(lc.getResources().getColor(R.color.black_bouy));
}
(lc是我从构造函数中获取的上下文)
如果我只使用Color.red,它可以找到。我见过的所有例子都使用ghet getResources ...,但是来自一个活动 有什么建议吗?
答案 0 :(得分:9)
好吧,实际上将Context
实例传递给适配器并保持其引用不应该是任何问题的来源(如内存泄漏等)。我是这么认为的,因为如果您查看ArrayAdapter<T>
的来源,那么您会看到它在构造函数中接受Context
并且(更重要的是)它通过私有成员保留对它的强引用mContext
并且有一个吸气剂 - getContext()
。它也没有任何代码可以以某种方式取消Context
与引用的链接,因此只要适配器存在,它就会存在。
但是在性能方面,我会在自定义适配器构造函数中定义颜色,然后直接在getView()
中使用它们,而无需多次调用getContext().getResources().getColor()
。
答案 1 :(得分:8)
创建适配器时,将 Context 传递给构造函数。在 getView()中,您可以调用 getContext()。getResources()。get ...这就是您要找的内容吗?
另外,@ MadedeTo是对的:你似乎保持对上下文的实时引用 - 不要!你会泄露你的背景。如果您绝对必须,请使用WeakReference&lt; Context&gt;并检查 null ,但我不明白你为什么要这样做。
UPD:对于Adapter
来说并不是一个问题(tnx指向@Arhimed和@Rperryng指出这一点),因为它们的正确用法可确保它们的生命周期不超过它们的生命周期Context
,因此可以将实时链接存储到Context
[,即使适配器本身在Context
中有实时引用 - GC很聪明,不是'被循环引用愚弄] 。然而,在这种情况下没有必要这样做:ArrayAdapter.getContext()
就是出于这个目的 - 所以当你需要在Inflater
中构建视图时,你可以访问资源并获得getView()
答案 2 :(得分:2)
对于这种资源加载,使用Context.getApplicationContext()静态方法来获取不属于视图的上下文。这样可以避免潜在的内存泄漏。