在另一个 class 中引用 MainActivity 的成员

Referring to a member of MainActivity in another class

我的 MainActivity 是这样开始的:

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

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

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

的实例

根据 How to reference the current or main activity from another class 这是 "a problem that lots of developers have"。该线程中的最佳答案是

If you already have a valid context, just use this: Activity activity = (Activity) context;

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

如果我尝试将该代码粘贴到我的 PickFromList class,Quick Fix 会告诉我它 "cannot resolve symbol 'context'" 并提议创建一个局部变量 'context'。但这于事无补。

你不应该从一个 activity 引用另一个,因为它会导致内存泄漏和崩溃 (https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e) 然后你应该通过全局状态或依赖注入共享这个 DBAdapter 实例。在这种情况下,您可以使用应用程序上下文来实例化 DBAdapter。 例如,您可以使用 App class

class App : Application() {

    companion object {
        lateinit var adapter: DBAdapter
    }

    override fun onCreate() {
        super.onCreate()
        adapter = DBAdapter(this)
    }
}

这是安全的,因为您只有一个 App class 实例,因此只有一个 Application Context。 在此之后,您可以在您的活动中使用像 App.adapter 这样的适配器。

但这是粗略的解决方案。更好的方法是通过依赖注入 (https://developer.android.com/training/dependency-injection)

为您提供依赖