【发布时间】:2018-12-22 13:57:24
【问题描述】:
我最近通过 JobService 将 JobScheduler 添加到我的应用程序中。我使用 JobService 在后台定期与我的数据库同步并更新本地 Room DB 实例。
但是,我看到出现错误的任意崩溃:
进程:com.application.name,PID:27229 java.lang.RuntimeException:无法实例化服务 com.application.name.Services.SyncService: java.lang.NullPointerException:尝试调用虚拟方法 'android.content.Context android.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(ActivityThread.java:3551) 在 android.app.ActivityThread.-wrap4(未知来源) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1778) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6798) 在 java.lang.reflect.Method.invoke(Method.java) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
崩溃报告突出显示的违规行是 JobService 构造函数中 Room DB 实例的实例化。
public SyncService() {
super();
database = AppDatabase.getDatabase(getApplication());
}
在 Room 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 的数据库构建器在设置时遇到问题。
我想知道的是,当应用未运行时,是否有某种方法可以访问我的 Room DB。将 Context 从 JobService 传递给初始化并编写辅助构造函数似乎是一个丑陋的黑客,可能会产生不可预测的情况,所以我想知道我还有哪些其他选择。
我可以做的一件事是将从 JobService 检索到的数据写入 SharedPreferences,然后在启动应用程序时将其同步到数据库。还有其他方法吗?
【问题讨论】:
-
小忙:以后不要只贴错误信息,请贴整个堆栈跟踪。
-
@CommonsWare :我添加了完整的堆栈跟踪。很抱歉滑倒了。顺便说一句,大粉丝。你对其他问题的回答和见解帮助我的次数比你知道的要多。 :)
-
“我已经添加了完整的堆栈跟踪”——谢谢!这和我从你的描述中预期的差不多。但是,堆栈跟踪有时会显示问题作者没有预料到的东西,因此在这些情况下拥有完整的跟踪会有所帮助。您的错误很奇怪,因为这意味着
JobService上的getApplication()有时会返回null,这令人不安。不过,您的解决方案是一个很好的第一步,当您发布自己的解决方案时,我已经写到一半了。 “顺便说一句,大粉丝”——谢谢你的好话! -
" 不过,您的解决方案是一个很好的第一步" -- 感谢您的鼓励和支持。在接下来的几天里,我会继续关注这个应用程序,如果我看到任何新的或好奇的东西,我会在这里添加一个更新。 :)
-
嗨,我已经在我的应用程序上工作了很多次,我看到 NPE 在 getApplicationContext() 或 getApplication() 或“this”上出现了相当多的复发。关于如何避免这种情况的任何指示都会很棒!
标签: android android-room jobservice