满堂花醉三千客,一剑霜寒十四洲。这篇文章主要讲述ApplicationContext或Activity Context是否适合Adapter?相关的知识,希望能为你提供帮助。
我在我的项目中使用适配器进行ListView / RecycleView。但我想知道哪种上下文应该传递给适配器? ApplicationContext或Activity Context(它意味着活动上的这个)?据我所知,即使活动被杀死,系统也不会杀死适配器。所以我在这里有一些困惑:
- 如果我将活动上下文传递给适配器,那么适配器具有对活动的隐式引用。活动可以被杀死吗?
- 另一方面,我传递ApplicationContext。适配器还能存在多长时间?活动被杀后GC会收集吗?
- 在特定情况下我应该通过哪种上下文?
答案
如果我将活动上下文传递给适配器,那么适配器具有对活动的隐式引用。活动可以被杀死吗?更正它是一个显式引用,因为您手动传递它。所以基本上你的问题的答案可能是YES,因为持有适配器的人是活动本身,即使适配器持有对你的活动的引用,一旦活动完成,它们都将被垃圾收集。
除非您正在处理Threads,否则建议使用
WeakReference
,因为Thread可以比活动本身更长寿。另一方面,我传递ApplicationContext。适配器还能存在多长时间?活动被杀后GC会收集吗?是
在特定情况下我应该通过哪种上下文?两者都可以工作,但应用程序上下文更安全。
据我所知,即使活动被杀死,系统也不会杀死适配器。代码中的某些东西是不正确的,可能是你正在使用静态或线程。此处需要其他代码或您的分析器证明!
另一答案ApplicationContext,因为如果你有超过1的话,你在销毁活动时应该通过GC清理它
另一答案【ApplicationContext或Activity Context是否适合Adapter()】使用RecyclerView(你更喜欢ListView)时,你很可能会实现
RecyclerView.Adapter
。你必须覆盖onCreateViewHolder
的方法之一,为您提供应该使用的上下文:@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Use this context
Context context = parent.getContext()
}
推荐阅读
- 如何使用Unity3D C#下载.app(点应用)文件()
- 错误(不兼容的类型:如果使用android室((__cursor.isNull(null)),则无法转换为int)
- 为什么Apple Accelerate框架有时会很慢()
- 在Google App Script中使用导入的模块
- 在apply函数中访问索引
- 如何正确使用mapPartitions函数
- 找不到adb请设置ANDROID_HOME异常 - Visual Studio
- Mac中的Android工作室路径错误
- 如何从app delegate访问NSViewController()