【问题标题】:Using the passed Context in an ArrayAdapter在 ArrayAdapter 中使用传递的 Context
【发布时间】:2012-01-27 17:19:21
【问题描述】:

在我的 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...,但来自一个活动。
有什么建议吗?

【问题讨论】:

    标签: android android-arrayadapter


    【解决方案1】:

    好吧,实际上将Context 实例传递给适配器并保持其引用不应成为任何问题的根源(如内存泄漏等)。我认为是这样,因为如果您检查源代码,例如 ArrayAdapter<T>,那么您会看到它在构造函数中也接受 Context 并且(更重要的是)它通过私有成员 mContext 和有一个吸气剂 - getContext()。它也没有任何代码可以以某种方式取消 Context 与引用的链接,因此只要适配器存在,它就会存在。

    但就性能而言,我会在您的自定义适配器构造函数中定义颜色,然后直接在 getView() 中使用它们,而无需多次调用 getContext().getResources().getColor()

    【讨论】:

    • 嗯,是的,看看代码,我认为你是对的,没有 WeakReferences 或任何其他预防措施。适配器在活动时被销毁,因此在适配器中保留对活动的引用是安全的。不过,这将是多余的,因为已经有一个:)
    【解决方案2】:

    当您创建适配器时,您将 Context 传递给构造函数。在getView()中你可以调用getContext().getResources().get...这是你要找的吗?

    另外,@MahdeTo 是对的:您似乎保留了对上下文的实时引用 - 不要!你会泄露你的上下文。如果您绝对必须,请使用 WeakReference 并检查 null,但我不明白您为什么必须这样做。

    UPD:Adapters 并不是真正的问题(@Arhimed 和 @Rperryng 指出了这一点),因为它们的正确使用可确保它们的生命周期不超过 @987654324 的生命周期@,因此可以将实时链接存储到 Context [即使适配器本身在 Context 中有实时引用 -- GC 非常聪明,不会被循环引用愚弄]时间>。尽管如此,在这种情况下没有必要这样做:ArrayAdapter.getContext() 就是为了这个确切的目的——所以当你需要在 getView() 中构建视图时,你可以访问资源并获得一个 Inflater

    【讨论】:

    • 太棒了。做到了!起初它不起作用,但经过清理和重建后,它就像一个冠军。谢谢你们。
    • 有趣的是,在查看 arrayAdapter github.com/android/platform_frameworks_base/blob/master/core/… 的源代码时,它们似乎保留了对传递给构造函数的上下文对象的硬引用
    • @Rperryng 是的,你和 Arhimed 是对的,在适配器中链接 Context 不会导致任何问题——除非适配器本身被泄露(或由于某种原因在活动重新创建之间保留),但是那将是一个不同的问题。
    【解决方案3】:

    对于这种资源加载使用 Context.getApplicationContext() 静态方法来获取不属于视图的上下文。这样可以避免潜在的内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多