如何获得Android库内的上下文?

问题描述 投票:0回答:1

我创建了一个Android库,其中有一个Room数据库,由于Room数据库应该只有一个实例,我有 OfflineDatabaseManager getInstance 方法,该方法将实例提供给 Android project 通过传递上下文来访问它。我在Android项目中拥有上下文,我可以传递它。

我想监听库内数据库表的变化,这样我就可以对它做一些事情,我已经写了一个类。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 - 我如何通过上下文来获取DB的信息?

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())
                }
            }
        }

我想做同样的事情,但在库内。

谢谢

android android-room android-library kotlin-coroutines
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.