3

我最近通过 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 引起:尝试在 com.application.name.Database.AppDatabase.getDatabase(AppDatabase.java 的空对象引用上调用虚拟方法 'android.content.Context android.content.Context.getApplicationContext()' :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(Unknown Source) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1778) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper .loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6798) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 处调用 (Method.java) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)

崩溃报告突出显示的违规行是 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;
    }

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

我想知道的是,当应用程序未运行时,是否有某种方法可以访问我的 Room DB。将 Context 从 JobService 传递给初始化并编写辅助构造函数似乎是一个丑陋的黑客,可能会产生不可预测的情况,所以我想知道我还有哪些其他选择。

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

4

2 回答 2

3

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

而不是通过:

 database = AppDatabase.getDatabase(getApplication());

我需要做的就是:

 database = AppDatabase.getDatabase(this);

到目前为止,我还没有遇到任何反复发生的崩溃……还没有。我仍然对其他答案持开放态度,所以如果您认为我可以以更好的方式做到这一点,请加入您的观点。

于 2018-12-22T14:09:11.213 回答
0

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

于 2021-03-14T09:29:32.353 回答