最近、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. null オブジェクト参照に対する content.Context.getApplicationContext()'
完全なスタック トレースは次のとおりです。
java.lang.NullPointerException が原因: com.application.name.Database.AppDatabase.getDatabase(AppDatabase.java) の null オブジェクト参照で仮想メソッド '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(不明なソース) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1778) android.os.Handler.dispatchMessage(Handler.java:105) android.os.Looper java.lang.reflect.Method の android.app.ActivityThread.main(ActivityThread.java:6798) の .loop(Looper.java:164)。com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) の invoke(Method.java) 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 からの初期化に渡し、セカンダリ コンストラクターを作成することは、予測できない状況を引き起こす可能性のある醜いハックのように思えるので、他にどのようなオプションがあるのか疑問に思っています。
私ができることの 1 つは、JobService から取得したデータを SharedPreferences に書き込み、アプリの起動時にそれを DB に同期することです。他に方法はありますか?