私はここで初めてなので、これを正しく行っているかどうかわかりません。
テーマ (基本的に時間指定イベント) を firestore db にアップロードできるアプリを作成しています。私が抱えている問題は、これらのイベントを適切に管理する方法です。現在WorkManager
、新しいテーマが追加されているかどうかを確認するために、1 時間ごとにデータベースからの読み取りをスケジュールするために を使用していますが、これに関する問題は、サービスがまだ開始されていない可能性があるため、アプリを開くと作成した空の状態になることです。が表示され、スワイプして更新するなどしてサービスを手動で開始する方法がわかりませんでした。
また、現在、実際にfirestoreから新しいテーマを取得すると、オフラインの部屋のデータベースを新しいテーマと同期するように設定されていますが、これは非常にうまく機能しています. ただし、より流動的で自動化したいので、WorkManager
注目に値する場合SharedPreferences
は、テーマのステータスを追跡し、そのステータスに基づいて通知を送信するために使用しようとしました(開始中、開始済み、終了済み)が、これの問題は、毎回アプリデータをクリアする必要があることです私はそれを機能させるためにアプリをインストールしました。
これを行うには、どのように正確に行いますか?
正しい方向への微調整が望ましいですが、コード例も大歓迎です (おそらく疑似コード)。
ワーカー クラス:
@Override
@NonNull
public Result doWork() {
try{
Query query = firestore.collection("themes").orderBy("start_time");
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
for(DocumentSnapshot snapshot : task.getResult()){
if(snapshot.exists()){
Themes themes = snapshot.toObject(Themes.class);
themeKey = snapshot.getId();
DateTime today = new DateTime();
DateTime start_time = new DateTime(themes.start_time);
DateTime end_time = start_time.plus(INTERVAL);
if (today.isBefore(start_time)) {
CurrentTheme currentTheme = new CurrentTheme(themes.theme_name, themes.theme_description,
String.valueOf(start_time.getMillis()), "Starts in: ", themeKey, themes.sponsor_url, themes.theme_img);
mFirebaseMethods.insert(currentTheme);
if(!FireApp.getPreferences().getBoolean("starting", false)){
notifyThemeStatus(currentTheme.getTheme_name() + " starting at " +
start_time.toString(), FireApp.getApp()
.getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0).getString("regId", null));
editor = FireApp.getPreferences().edit();
editor.putBoolean("starting", true);
editor.putBoolean("started", false);
editor.putBoolean("ended", false);
editor.apply();
}
} else if(today.isAfter(start_time) && today.isBefore(end_time)){
mFirebaseMethods.deleteByTime(String.valueOf(start_time.getMillis()));
CurrentTheme currentTheme = new CurrentTheme(themes.theme_name, themes.theme_description,
String.valueOf(end_time.getMillis()), "Ends in: ", themeKey, themes.sponsor_url, themes.theme_img);
mFirebaseMethods.update(currentTheme);
if(!FireApp.getPreferences().getBoolean("started", false)) {
notifyThemeStatus(themes.theme_name + " ends " +
getRelativeTimeSpanString(themes.start_time + INTERVAL).toString(), FireApp.getApp()
.getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0).getString("regId", null));
editor = FireApp.getPreferences().edit();
editor.putBoolean("starting", false);
editor.putBoolean("started", true);
editor.apply();
}
} else if (today.isAfter(end_time)){
CurrentTheme currentTheme = new CurrentTheme(themes.theme_name, themes.theme_description,
String.valueOf(0), "Ended", themeKey, themes.sponsor_url, themes.theme_img);
mFirebaseMethods.update(currentTheme);
//checkWinner(themeKey, themes.start_time, themes.theme_name);
if(!FireApp.getPreferences().getBoolean("ended", false)) {
notifyThemeStatus(themes.theme_name + " has ended.", FireApp.getApp()
.getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0).getString("regId", null));
editor = FireApp.getPreferences().edit();
editor.putBoolean("ended", true);
editor.putBoolean("started", false);
editor.apply();
}
}
}
}
}
}
});
return Result.SUCCESS;
}catch (Throwable throwable){
Log.e("PopulateThemeCache", "Error caching", throwable);
return Result.FAILURE;
}
}
アプリケーション クラスでワーカーを開始する場所:
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest populateCache = new PeriodicWorkRequest.Builder(PopulateThemeCache.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.addTag("Theme_Update")
.build();
WorkManager.getInstance().enqueue(populateCache);
mFirebaseMethods
ルーム データベース操作を実行するためのすべての asynctask コードを含むリポジトリ クラスです。