我正在使用同时使用 firebase Messaging 和 ROOM DATABASE 的应用程序。
这就是DB的初始化
的方式public static AppDatabase getInstance(final Context appContext) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(appContext, AppDatabase.class, "dbname.db")
// prepopulate the database after onCreate was called
.addCallback(rdc)
.build();
}
return INSTANCE;
}
在MainActivity
上的某个地方,第一个调用AppDatabase
并实例化,所有数据库都可以正常工作,并且dandy!
现在,当用户kill
应用程序...
为了简单起见,想想这个应用程序,例如 whatsapp ...应用程序被杀死,但是正在聆听消息的service (MyFirebaseMessagingService)
仍在运行(如它应该(。
当新消息到达并且MyFirebaseMessagingService
试图将其保存到数据库中,并通过呼叫AppDatabase.getInstance()
将崩溃发生崩溃,因为巫婆上的初始context
引用数据库的创建不再存在,因为该应用程序已被杀死。
搜索如何解决此问题,我了解到每个服务this
实际上都是从context
派生的,因此我立即尝试使用MyFirebaseMessagingService
上下文来初始化数据库,但是,您真正可以访问服务上下文的MyFirebaseMessagingService::onCreate
无法获得。开火,直到第一条消息到达
我唯一能想到的解决方案是创建一个全新的服务,即bindService()
,它将其用于主动脉,并使用新服务上下文来创建AppDatabase实例...但是看来完全过高了。
所以我的问题是,如何以MyFirebaseMessagingService
仍然可以使用它的方式来初始化房间数据库,即使该应用被杀死?
getApplicationContext()
在构造函数函数中不可用。但是它可以在onStartCommand()
功能中可用。我认为这是在服务中构建/打开数据库的好地方。
,因为 FirebaseMessagingService
是我们应该在那里拥有getApplicationContext()
的服务,因此您应该使用它来创建DB的实例并执行必要的操作,其他选项是创建服务或编写自定义广播接收器。
首先:从系统上下文(notification_service(中,您尝试使用使用应用程序上下文访问或创建数据库的空间。但是在那一刻,应用程序上下文可能是无效的。也许只是因为该应用被杀死。因此,您会出现不错的崩溃。
第二,有些日志会很好。坠机。它可能使人们无法猜测。
第三:(再次猜测(也许您应该尝试工作经理。类似:您收到数据>开始工作。将在那一刻可靠地运行,不必在那一刻运行。这里可以从这里开始的好地方