如何在 Android 库中获取上下文
How to get the Context within the Android library
抱歉,如果我的标题与我的问题不符。
我创建了一个 Android 库,其中有一个 Room 数据库,因为 Room 数据库应该只有一个实例,所以我有 OfflineDatabaseManager
getInstance
方法,该方法将实例提供给 Android project
通过传递上下文来访问它。我在 Android 项目中有上下文,我可以通过它。
我想听听库中数据库 table 发生的变化,这样我就可以用它做点什么,我在库中写了一个 class OfflineDataChangeListener
但是获取我需要传递上下文的数据库实例,请问我如何在库中执行此操作。
库 - OfflineDatabaseManager
class OfflineDatabaseManager private constructor(private val dp: LibraryDatabase) {
fun getOfflineData() : Flow<List<OfflineData>> {
return dp.getOfflineDataDao().getOfflineData()
}
suspend fun insertOfflineData(offlineData: OfflineData) {
dp.getOfflineDataDao().insertOfflineData(offlineData)
}
companion object {
@Volatile
private var INSTANCE: OfflineDatabaseManager? = null
fun getInstance(context: Context): OfflineDatabaseManager {
return INSTANCE ?: synchronized(this) {
INSTANCE ?: run {
val db = Room.databaseBuilder(
context,
LibraryDatabase::class.java, "database-name"
).build()
OfflineDatabaseManager(db).also { INSTANCE = it }
}
}
}
}
}
库 - OfflineDataChangeListener - 如何通过上下文获取数据库实例
class OfflineDataChangeListener: CoroutineScope {
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun observeOfflineDataChanges() {
launch {
OfflineDatabaseManager.getInstance(HOW TO GET CONTEXT HERE).getOfflineData().collect {
Log.d("dbChangeListener", "I am listening to databas echanges")
}
}
}
}
Android 项目 -
在我的 android 项目中,这是我访问和收听更改的方式
fun getOfflineData() {
launch {
OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData().collect {
Timber.d( "observing offline data" + it.toString())
}
}
}
我想做同样的事情,但在图书馆内。
谢谢
R
您可以为将 Context
传递给您的图书馆的客户提供一些功能。在您的图书馆中创建一个 object
class:
object Library {
lateinit var context: Context
fun init(ctx: Context) {
context = ctx.applicationContext
}
}
客户必须调用您的 init()
函数,例如,在其应用程序的 onCreate()
方法中:
Library.init(this)
在图书馆中,您可以像这样访问它:
OfflineDatabaseManager.getInstance(Library.context)
抱歉,如果我的标题与我的问题不符。
我创建了一个 Android 库,其中有一个 Room 数据库,因为 Room 数据库应该只有一个实例,所以我有 OfflineDatabaseManager
getInstance
方法,该方法将实例提供给 Android project
通过传递上下文来访问它。我在 Android 项目中有上下文,我可以通过它。
我想听听库中数据库 table 发生的变化,这样我就可以用它做点什么,我在库中写了一个 class OfflineDataChangeListener
但是获取我需要传递上下文的数据库实例,请问我如何在库中执行此操作。
库 - OfflineDatabaseManager
class OfflineDatabaseManager private constructor(private val dp: LibraryDatabase) {
fun getOfflineData() : Flow<List<OfflineData>> {
return dp.getOfflineDataDao().getOfflineData()
}
suspend fun insertOfflineData(offlineData: OfflineData) {
dp.getOfflineDataDao().insertOfflineData(offlineData)
}
companion object {
@Volatile
private var INSTANCE: OfflineDatabaseManager? = null
fun getInstance(context: Context): OfflineDatabaseManager {
return INSTANCE ?: synchronized(this) {
INSTANCE ?: run {
val db = Room.databaseBuilder(
context,
LibraryDatabase::class.java, "database-name"
).build()
OfflineDatabaseManager(db).also { INSTANCE = it }
}
}
}
}
}
库 - OfflineDataChangeListener - 如何通过上下文获取数据库实例
class OfflineDataChangeListener: CoroutineScope {
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun observeOfflineDataChanges() {
launch {
OfflineDatabaseManager.getInstance(HOW TO GET CONTEXT HERE).getOfflineData().collect {
Log.d("dbChangeListener", "I am listening to databas echanges")
}
}
}
}
Android 项目 -
在我的 android 项目中,这是我访问和收听更改的方式
fun getOfflineData() {
launch {
OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData().collect {
Timber.d( "observing offline data" + it.toString())
}
}
}
我想做同样的事情,但在图书馆内。
谢谢 R
您可以为将 Context
传递给您的图书馆的客户提供一些功能。在您的图书馆中创建一个 object
class:
object Library {
lateinit var context: Context
fun init(ctx: Context) {
context = ctx.applicationContext
}
}
客户必须调用您的 init()
函数,例如,在其应用程序的 onCreate()
方法中:
Library.init(this)
在图书馆中,您可以像这样访问它:
OfflineDatabaseManager.getInstance(Library.context)