kotlin - 为什么要为 ApplicationContext 对象添加注解 @ApplicationContext?
问题描述
代码 A 来自https://developer.android.com/codelabs/android-hilt#6
代码 B 来自https://developer.android.com/codelabs/android-hilt#7
我发现代码A中的appContext:Context之前添加了注释@ApplicationContext,而代码B中的私有val活动:FragmentActivity之前没有添加注释,为什么?
还有更多我可以使用代码 C 而不是代码 A 吗?
代码 A
@Module
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
...
}
}
代码 B
class AppNavigatorImpl @Inject constructor(
private val activity: FragmentActivity
) : AppNavigator {
...
}
代码 C
@Module
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(appContext: ApplicationContext): AppDatabase {
...
}
}
解决方案
单身人士比活动更长寿。由于 Activity 是 Context 的子类型,如果将其传递给挂在引用上的单例(只是将其用作 Context),则该 Activity 已被泄露。这@ApplicationContext
是一个指示,您应该只将应用程序上下文作为函数的参数传递。应用程序上下文在应用程序的生命周期内是恒定的,因此它是防泄漏的。
注释是一种记录您不应将活动作为上下文传递的方式,但如果您不小心这样做了,Lint 也会警告您。
代码 C没有意义,因为您已经创建了 ApplicationContext 类型的参数,它是一个注释类,而不是 Context 子类型。
推荐阅读
- python - 需要帮助解决有关计数和设置的问题
- vala - 如何将 Vala 编译为 C 并调用另一个文件中的函数,该文件最初是用 C 编写的并全部编译?
- java - 检查对象的结果是否为非 null 然后转换为布尔值并在 Java 中设置的简短版本
- pandas - 我不断收到 KeyError
- reactjs - 如何从 Markdown 文件中查询 gatsby 中的 zip 文件?
- swiftui - 强制导航栏项目中 NavigationLink 的目标到辅助/详细视图
- c - C中的数组和空字符
- c# - Xamarin --- 短时间播放安卓闹钟
- python - 在文件系统中创建和共享 python 包
- python - 与输入参数一样多的元组?