首页 > 解决方案 > 在另一个类中引用 MainActivity 的成员

问题描述

我的 MainActivity 是这样开始的:

class MainActivity : AppCompatActivity() {
val mDBAdapter = DBAdapter(this, "nearbydata")

我想在另一个类 PickFromList(扩展 ListActivity)中使用数据库适配器。

我似乎无法将其称为 MainActivity.mDBAdapter。我知道这是因为没有 MainActivity 类的实例。

根据如何从另一个类中引用当前或主要活动,这是“许多开发人员遇到的问题”。该线程中的最佳答案为

如果您已经有一个有效的上下文,只需使用这个:Activity activity = (Activity) context;

不幸的是,对于像我这样没有经验的人来说这没有帮助。我怎么知道我是否有一个有效的上下文?如果我没有一个,我怎么得到一个?

如果我尝试将该代码粘贴到我的 PickFromList 类中,Quick Fix 会告诉我它“无法解析符号 'context'”并提供创建局部变量 'context'。但这无济于事。

标签: androidandroid-activitymember

解决方案


您不应该从一个活动引用另一个活动,因为它可能导致内存泄漏和崩溃(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)为您提供依赖


推荐阅读