引用另一个类中的MainActivity成员。

问题描述 投票:0回答:1

我的MainActivity是这样开始的。

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

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

我似乎不能将它引用为MainActivity.mDBAdapter。我理解这是因为没有MainActivity类的实例。

根据我的理解,这是因为没有MainActivity类的实例。如何从另一个类中引用当前或主要活动? 这是 "很多开发者都有的问题"。该主题的最高答案是

如果你已经有了一个有效的上下文,就用这个。Activity activity = (Activity) context;

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

如果我试着将这些代码粘贴到我的PickFromList类中,Quick Fix告诉我它 "无法解析符号'context'",并提出创建一个本地变量 "context"。但这并没有帮助。

android android-activity member
1个回答
1
投票

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

class App : Application() {

    companion object {
        lateinit var adapter: DBAdapter
    }

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

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

但这是一个粗糙的解决方案。更好的方法是通过依赖注入(Dependency injection)为你提供依赖。https:/developer.android.comtrainingdependency-injection。)

© www.soinside.com 2019 - 2024. All rights reserved.