如何在 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)