【问题标题】:How to get the Context within the Android library如何在 Android 库中获取 Context
【发布时间】:2020-09-25 18:49:26
【问题描述】:

抱歉,如果我的标题与我的问题不符。 我创建了一个 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 项目 -

在我的 android 项目中,这是我访问和收听更改的方式

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

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

谢谢 回复

【问题讨论】:

    标签: android kotlin android-room kotlin-coroutines android-library


    【解决方案1】:

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

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

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

    Library.init(this)
    

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

    OfflineDatabaseManager.getInstance(Library.context)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2020-11-06
      • 2016-08-01
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多