我的MainActivity是这样开始的。
class MainActivity : AppCompatActivity() {
val mDBAdapter = DBAdapter(this, "nearbydata")
我想在另一个类PickFromList中使用数据库适配器 (它是ListActivity的扩展).
我似乎不能将它引用为MainActivity.mDBAdapter。我理解这是因为没有MainActivity类的实例。
根据我的理解,这是因为没有MainActivity类的实例。如何从另一个类中引用当前或主要活动? 这是 "很多开发者都有的问题"。该主题的最高答案是
如果你已经有了一个有效的上下文,就用这个。Activity activity = (Activity) context;
不幸的是,对于像我这样没有经验的人来说,这没有任何帮助。我如何知道我是否有一个有效的上下文?如果我没有,我怎么得到一个?
如果我试着将这些代码粘贴到我的PickFromList类中,Quick Fix告诉我它 "无法解析符号'context'",并提出创建一个本地变量 "context"。但这并没有帮助。
你不应该从一个活动引用到另一个活动,因为这会导致内存泄漏和崩溃 (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。)