Недавно я добавил 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;
}
Итак, я думаю, что понимаю, почему это происходит - когда приложение не работает, контекст приложения равен нулю, поэтому построитель базы данных Room сталкивается с проблемами при настройке.
Я хотел бы знать, есть ли способ получить доступ к моей базе данных Room DB, когда приложение не запущено. Передача контекста в инициализацию из JobService и написание вторичного конструктора кажется уродливым приемом, который может привести к непредсказуемым условиям, поэтому мне интересно, какие еще варианты у меня есть.
Я мог бы записать данные, полученные из JobService, в SharedPreferences, а затем синхронизировать их с БД при запуске приложения. Есть ли другой способ?
getApplication()
наJobService
может иногда возвращатьnull
, что беспокоит. Тем не менее, ваше решение - хороший первый шаг, и я наполовину его написал, когда вы опубликовали свое собственное. Кстати, большой фанат - спасибо за добрые слова! - person CommonsWare   schedule 22.12.2018