Javafx: многопоточность уведомления с напоминанием - PullRequest
0 голосов
/ 06 октября 2018

Я создаю систему, которая уведомляет пользователя о времени встречи.Мой вопрос: Хорошо ли создавать тему, когда пользователь добавляет новую встречу, которую будет прослушивать, когда дата встречи назначена, и отображать уведомление в правом нижнем углу

Мой код

DateFormat inFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm a");
DateFormat outFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
Timer timer = new Timer();

private void appointmentNotification() throws ParseException {
    //Convert 12hour time to 24hour
    String dateValues = date + " " + time;
    Date dateParse = inFormat.parse(dateValues);

    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            Notifications noti = Notifications.create();
            noti.text("Doctor "+doc+" has an Appointment with Patient "+patient);
            noti.title("Appointment");
            noti.hideAfter(Duration.seconds(10));
            noti.position(Pos.BOTTOM_RIGHT);

            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    noti.show();
                }
            });
        }
    }, outFormat.parse(outFormat.format(dateParse)));
}

Я полагаю, если пользователь добавил 50 встреч, будет запущено 50 потоков

1 Ответ

0 голосов
/ 14 октября 2018

Итак, я следовал логике, которую Зефир дал в комментарии, и это сработало для меня.

Я предполагаю, что назначения в какой-то момент добавляются в базу данных?Если это так, просто создайте один фоновый поток для регулярного опроса базы данных.Когда приближается встреча, покажите напоминание.

Код:

private void displayAppointmentNotification() {
    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a");

    Timer timer = new Timer();

    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            try {
                ps = HospitalDB.getCon().prepareStatement("Select * From Notification");
                rs = ps.executeQuery();

                while (rs.next()) {

                    if (rs.getString("Reminder").contentEquals(dateFormat.format(new Date()))) {
                        Notifications noti = Notifications.create();
                        noti.text("Doctor " + rs.getString("Doctor") + " has an Appointment with Patient " + rs.getString("Patient"));
                        noti.title("Appointment");
                        noti.hideAfter(Duration.seconds(30));
                        noti.position(Pos.BOTTOM_RIGHT);

                        Platform.runLater(() -> {
                            noti.show();
                        });

                        //Change The Appointment Status to Done
                        ps = HospitalDB.getCon().prepareStatement("Update Appointment Set Status=? Where Patient=? and Doctor=?");
                        ps.setString(1, "Done");
                        ps.setString(2, rs.getString("Patient"));
                        ps.setString(3, rs.getString("Doctor"));
                        ps.executeUpdate();

                        populateTable();
                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };
    timer.schedule(task, 0, 1 * 1000);
}

Фоновый поток всегда будет смотреть на даты в базе данных и совпадать с датой системы.отображает уведомление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...