Добавление предмета в базу данных комнат в указанное c время каждый день - PullRequest
0 голосов
/ 29 марта 2020

Мне нужен код для добавления элемента в Room Database в 12:00 каждый день. Я пробовал много способов, таких как WorkManager и AlarmManager, но они не достигли этой цели

1 Ответ

0 голосов
/ 29 марта 2020

Вот реализация того, что я упомянул в своем комментарии:

public class MainActivity extends AppCompatActivity {
    private static final String PREF_PAUSE_TIME_KEY = "exit_time";

    private static final Long MILLIS_IN_DAY = 86400000L;

    private static final int TRIGGER_HOUR = 12;
    private static final int TRIGGER_MIN = 0;
    private static final int TRIGGER_SEC = 0;

    private final Handler handler = new Handler();
    private SharedPreferences prefs;

    private final Calendar calendar = Calendar.getInstance();

    private final Runnable addItemRunnable = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(addItemRunnable, MILLIS_IN_DAY);
            addItem();
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Add missing events since onPause.
        long resumeTime = System.currentTimeMillis();
        long pauseTime = prefs.getLong(PREF_PAUSE_TIME_KEY, resumeTime);

        // Set calendar to trigger time on the day the app was paused.
        calendar.setTimeInMillis(pauseTime);
        calendar.set(Calendar.HOUR_OF_DAY, TRIGGER_HOUR);
        calendar.set(Calendar.MINUTE, TRIGGER_MIN);
        calendar.set(Calendar.SECOND, TRIGGER_SEC);

        long time;
        while (true) {
            // If calendar time is during the time that app was on pause, add item.
            time = calendar.getTimeInMillis();
            if (time > resumeTime) {
                // Past current time, all items were added.
                break;
            } else if (time >= pauseTime) {
                // This time happened when app was on pause, add item.
                addItem();
            }

            // Set calendar time to same hour on next day.
            calendar.add(Calendar.DATE, 1);
        }

        // Set handler to add item on trigger time.
        handler.postDelayed(addItemRunnable, time - resumeTime);
    }

    @Override
    protected void onPause() {
        super.onPause();

        // Save pause time so items can be added on resume.
        prefs.edit().putLong(PREF_PAUSE_TIME_KEY, System.currentTimeMillis()).apply();

        // Cancel handler callback to add item.
        handler.removeCallbacks(addItemRunnable);
    }

    private void addItem() {
        // Add item to database and RecyclerView.
    }
}
  • Когда вызывается onPause, текущее время сохраняется в настройках.
  • Когда onResume вызвано, программа добавляет каждый элемент, который должен был быть добавлен, пока приложение не было открыто.
  • Когда приложение открыто, программа использует Handler, чтобы опубликовать задачу с указанным c time.

Вы можете переместить код куда угодно, скорее всего, в вашем хранилище или в модели представления, если она у вас есть. Для таймера вы можете использовать Rx Java для таймера в приложении или что-то еще на самом деле.

Если пользователь изменит время на несколько дней раньше, добавленные элементы не будут удалены. Если пользователь затем вернет его в нормальное состояние, элементы на несколько дней будут продублированы. Вы можете предотвратить это, сохранив время в onPause, только если оно больше последнего сохраненного времени.

...