RoomDB in JobSchedulerService



我最近通过JobService将JobScheduler添加到我的应用程序中。我使用JobService在后台定期与数据库同步,并更新本地Room DB实例。

然而,我看到了带有错误的任意崩溃:

进程:com.application.name,PID:27229java.lang.RuntimeException:无法实例化服务com.application.name.Services.SyncService:java.lang.NullPointerException:尝试调用虚拟方法'android.content.Contextandroid.content.Context.getApplicationContext()'参考

完整堆栈跟踪如下:

java.lang.NullPointerException引起:尝试调用虚拟方法"android.content.Context"android.content.Context.getApplicationContext()'参考网址:com.application.name.Database.AppDatabase.getDatabase(AppDatabase.java:38)网址:com.application.name.Services.SyncService.(SyncService.java:48)位于java.lang.Class.newInstance(Class.java)在android.app.ActivityThread.handleCreateService(ActivityThreads.java:3551)在android.app.ActivityThread.-wrap4(未知来源)在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1778)在android.os.Handler.dispatchMessage(Handler.java:105)在android.os.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThreads.java:6798)位于java.lang.reflect.Method.ioke(Method.java)网址:com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:767)

崩溃报告突出显示的违规行是JobService构造函数中Room DB实例的实例化。

public SyncService() {
super();
database = AppDatabase.getDatabase(getApplication());
}

在房间DAO中,我有以下代码:

private static AppDatabase INSTANCE;
public static AppDatabase getDatabase(final Context context){
if(INSTANCE == null) {
synchronized (AppDatabase.class){
if(INSTANCE == null){
// Migration definitions go here
..
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, context.getResources().getString(R.string.database))
.allowMainThreadQueries()
.addMigrations(FROM_2_TO_3)
.build();
}
}
}
return INSTANCE;
}

所以我想我理解为什么会发生这种情况——当应用程序不运行时,应用程序上下文为Null,所以Room的数据库生成器在设置时会遇到问题。

我想知道的是,当应用程序不运行时,是否有办法访问我的房间数据库。从JobService向初始化传递Context并编写二级构造函数似乎是一个丑陋的破解,可能会产生不可预测的条件,所以我想知道我还有什么其他选择。

我可以做的一件事是将从JobService检索到的数据写入SharedPreferences,然后在应用程序启动时将其同步到DB。还有别的办法吗?

我想我错过了一个简单的事实——服务就是上下文。

代替通过:

database = AppDatabase.getDatabase(getApplication());

我所需要做的就是:

database = AppDatabase.getDatabase(this);

到目前为止,我还没有发生过任何反复发生的车祸。。。然而我仍然对其他答案持开放态度,所以如果你认为我能以更好的方式做到这一点,请谈谈你的观点。

applicationContext应在调用onCrate()方法后调用。因此,您需要在onCreate()方法中运行代码。

相关内容

  • 没有找到相关文章

最新更新