首页 > 解决方案 > 如何在 Android 库中获取 Context

问题描述

抱歉,如果我的标题与我的问题不符。我创建了一个 Android 库,其中有一个 Room 数据库,因为应该只有一个 Room 数据库实例,所以我有一个OfflineDatabaseManager getInstance方法,该方法通过传递上下文来提供实例来Android project访问它。我在 Android 项目中有上下文,我可以通过它。

我想听一下库中数据库表上发生的变化,这样我就可以用它做点什么,我OfflineDataChangeListener在库中编写了一个类,但是要获取数据库的实例,我需要传递上下文,我该怎么做请在图书馆内。

库 - 离线数据库管理器

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 项目中,这是我访问和收听更改的方式

 fun getOfflineData() {
            launch {
                OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData().collect {
                    Timber.d( "observing offline data" + it.toString())
                }
            }
        }

我想在图书馆内做同样的事情。

谢谢R

标签: androidkotlinandroid-roomkotlin-coroutinesandroid-library

解决方案


Context您可以为传递给您的库的客户端提供一些功能。在您的库中创建一个object类:

object Library {
    lateinit var context: Context
    fun init(ctx: Context) {
        context = ctx.applicationContext
    }
}

客户端必须调用您的init()函数,例如,在他们的应用程序的onCreate()方法中:

Library.init(this)

在库中,您可以像这样访问它:

OfflineDatabaseManager.getInstance(Library.context)

推荐阅读