ApplicationContext或Activity Context是否适合Adapter?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ApplicationContext或Activity Context是否适合Adapter?相关的知识,希望对你有一定的参考价值。

我在我的项目中使用适配器进行ListView / RecycleView。但我想知道哪种上下文应该传递给适配器? ApplicationContext或Activity Context(它意味着活动上的这个)?据我所知,即使活动被杀死,系统也不会杀死适配器。所以我在这里有一些困惑:

  1. 如果我将活动上下文传递给适配器,那么适配器具有对活动的隐式引用。活动可以被杀死吗?
  2. 另一方面,我传递ApplicationContext。适配器还能存在多长时间?活动被杀后GC会收集吗?
  3. 在特定情况下我应该通过哪种上下文?

谢谢,

答案

如果我将活动上下文传递给适配器,那么适配器具有对活动的隐式引用。活动可以被杀死吗?

更正它是一个显式引用,因为您手动传递它。所以基本上你的问题的答案可能是YES,因为持有适配器的人是活动本身,即使适配器持有对你的活动的引用,一旦活动完成,它们都将被垃圾收集。

除非您正在处理Threads,否则建议使用WeakReference,因为Thread可以比活动本身更长寿。

另一方面,我传递ApplicationContext。适配器还能存在多长时间?活动被杀后GC会收集吗?

在特定情况下我应该通过哪种上下文?

两者都可以工作,但应用程序上下文更安全。

据我所知,即使活动被杀死,系统也不会杀死适配器。

代码中的某些东西是不正确的,可能是你正在使用静态或线程。此处需要其他代码或您的分析器证明!

另一答案

ApplicationContext,因为如果你有超过1的话,你在销毁活动时应该通过GC清理它

另一答案

使用RecyclerView(你更喜欢ListView)时,你很可能会实现RecyclerView.Adapter。你必须覆盖onCreateViewHolder的方法之一,为您提供应该使用的上下文:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // Use this context
    Context context = parent.getContext()
}

以上是关于ApplicationContext或Activity Context是否适合Adapter?的主要内容,如果未能解决你的问题,请参考以下文章

ApplicationContext或Activity Context是否适合Adapter?

Activiti 流程部署方式 activi 动态部署(高级源代码篇)

Ambiguous method call. Both findViewById (int) in AppCompatActivity and findViewById (int) in Activi

applicationContext.xml 存放到工程下resources文件 而不是放在src 或webroot的话要怎么配置 web.xml文件

JNDI 解决了 Spring 中 ApplicationContext 没有解决的哪个问题?

Dagger 2 Activity 上下文/ApplicationContext 模块