android - 在另一个类中引用 MainActivity 的成员
问题描述
我的 MainActivity 是这样开始的:
class MainActivity : AppCompatActivity() {
val mDBAdapter = DBAdapter(this, "nearbydata")
我想在另一个类 PickFromList(扩展 ListActivity)中使用数据库适配器。
我似乎无法将其称为 MainActivity.mDBAdapter。我知道这是因为没有 MainActivity 类的实例。
根据如何从另一个类中引用当前或主要活动,这是“许多开发人员遇到的问题”。该线程中的最佳答案为
如果您已经有一个有效的上下文,只需使用这个:Activity activity = (Activity) context;
不幸的是,对于像我这样没有经验的人来说这没有帮助。我怎么知道我是否有一个有效的上下文?如果我没有一个,我怎么得到一个?
如果我尝试将该代码粘贴到我的 PickFromList 类中,Quick Fix 会告诉我它“无法解析符号 'context'”并提供创建局部变量 'context'。但这无济于事。
解决方案
您不应该从一个活动引用另一个活动,因为它可能导致内存泄漏和崩溃(https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e)那么你应该通过全局状态或依赖注入共享此 DBAdapter 实例。在这种情况下,您可以使用应用程序上下文来实例化 DBAdapter。例如,您可以使用 App 类
class App : Application() {
companion object {
lateinit var adapter: DBAdapter
}
override fun onCreate() {
super.onCreate()
adapter = DBAdapter(this)
}
}
这是安全的,因为您只有一个 App 类实例,因此只有一个应用程序上下文。在此之后,您可以在您的活动中使用像 App.adapter 这样的适配器。
但这是粗略的解决方案。更好的方法是通过依赖注入(https://developer.android.com/training/dependency-injection)为您提供依赖
推荐阅读
- powershell - Powershell 模式匹配
- python - 保持重复和非重复元素之间的关系
- android - 在 PeerConnection.IceServer 生成器错误时出现错误:找不到符号方法生成器(字符串)
- sql - 在 DB2 中使用星期几进行聚合
- python - 在gekko非线性回归中处理多维数组的正确方法是什么?
- excel - 我正在设置一个用户表单,我如何为特定范围做下一行?
- php - 在准备好的语句中不向 X 列插入值的逻辑
- angular - 未找到组件的组件工厂。你把它添加到@NgModule.entryComponents 了吗?
- go-cd - 在 GoCD 中 mvn clean install 给出 mvn' 不是内部或外部命令,但正常的 cmd 项目构建成功
- ios - 带有 Janus iOS swift 的 webRTC