如何在Android库中获取上下文 [英] How to get the Context within the Android library

查看:637
本文介绍了如何在Android库中获取上下文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对不起,如果我的头衔与我的问题不符. 我创建了一个Android库,其中有一个Room数据库.由于应该只有一个Room数据库实例,所以我有OfflineDatabaseManager getInstance方法,该方法将实例提供给Android project,并通过传递语境.我在Android项目中有上下文,可以通过它.

Sorry if my title did not match to what my questions is. I have created a Android Library, in which I have a Room database, As there should be only one instance of Room database, I have OfflineDatabaseManager getInstance method which provides the instance to the Android project which accesses it by passing the context. I have context within the Android project and I can pass it.

我想听听库中数据库表上发生的更改,所以我可以做些什么,我在库中编写了一个类OfflineDataChangeListener,但是要获取数据库实例,我需要传递上下文,请问如何在图书馆内做到这一点.

I want to listen to changes happening on the database table within the library so I can do something with it, I have written a class OfflineDataChangeListener within the library but to get the instance of the database I need to pass the context, how can I do that within the library please.

库-OfflineDatabaseManager

Library - 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-如何通过上下文获取数据库实例

Library - OfflineDataChangeListener - HOW CAN I PASS CONTEXT TO GET THE INSTANCE OF 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项目-

Android project -

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

Within my android project this is how I access and listen to changes

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

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

I want to do the same but within the library.

谢谢 R

推荐答案

您可以向客户端提供一些功能,这些功能会将Context传递给您的库.在您的库中创建一个object类:

You can provide some function to the clients which passes the Context to your library. In your library create an object class:

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

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

Clients must call your init() function, for example, in their Application's onCreate() method:

Library.init(this)

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

And in the library you can access to it like this:

OfflineDatabaseManager.getInstance(Library.context)

这篇关于如何在Android库中获取上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆