RoomDB в JobSchedulerService

Я недавно добавил JobScheduler в свое приложение через JobService. Я использую 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)

Строка с ошибкой, выделенная в отчете о сбое, является экземпляром экземпляра Room DB в конструкторе JobService.

 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 возникают проблемы.

Я хотел бы знать, есть ли какой-нибудь способ получить доступ к моей комнате DB, когда приложение не запущено. Передача Context в инициализацию из JobService и написание вторичного конструктора кажется уродливым хаком, который может привести к непредсказуемым условиям, поэтому мне интересно, какие у меня есть другие варианты.

Одна вещь, которую я мог сделать, - записать данные, полученные из JobService, в SharedPreferences, а затем синхронизировать их с БД при запуске приложения. Есть ли другой путь?

2 ответа

Решение

Я думаю, что пропустил один простой факт - Сервис - это Контекст.

Вместо прохождения:

 database = AppDatabase.getDatabase(getApplication());

все, что мне нужно было сделать, это:

 database = AppDatabase.getDatabase(this);

До сих пор у меня не было никаких повторяющихся сбоев... пока. Я по-прежнему открыт для других ответов, так что следите за вашими взглядами, если вы думаете, что я могу сделать это лучше.

В applicationContext следует вызывать после onCrate()метод вызван. Следовательно, вам нужно запустить свой код внутри onCreate() метод.

Другие вопросы по тегам