Android: использование Thread для выполнения чего-либо в указанное время - PullRequest
1 голос
/ 31 марта 2012

В моем приложении есть база данных, в которой я храню что-то вроде напоминания.Один из столбцов представляет собой строковое представление времени, в которое напоминание должно быть «напоминано», например: чч: мм.Я создаю тему в своей основной деятельности, чтобы регулярно отслеживать все напоминания и проверять, пора ли устанавливать тревогу.Прежде чем создать этот поток, я загружаю времена + идентификаторы всех строк базы данных в ArrayList и работаю с этим ArrayList в своем потоке вместо самой базы данных (у меня были некоторые проблемы с этим).В любом случае, вот код:

Сначала я объявляю глобальные переменные с помощью класса Application:

public class MyApplication extends Application {
    public ArrayList<String> reminders = new ArrayList<String>();
    public int hour;
    public int minute;
}

И в своей основной деятельности:

public class Home extends Activity {

    ArrayList<String> reminders;
    String time:
    int hour;
    int minute;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        //The usual code at the beginning of onCreate method

        //I load my global variables
        MyApplication appState = ((MyApplication)getApplicationContext());
        reminders = appState.reminders;
        hour = appState.hour;
        minute = appState.minute;

        //I save curren time into global variables
        Calendar c = Calendar.getInstance();
        hour = c.get(Calendar.HOUR);
        minute = c.get(Calendar.MINUTE);

        //I loop over all rows of database and save what I need from them into
        //Strings in ArrayList reminders. I do this only once on Application
        //launch to load already existing rows. When the application runs
        //I can always add or remove existing rows using special Activity

        //I create and start my Thread
        Thread t = new Thread() {
            try {
                while (true) {
                    time = hour + ":" + minute;
                    if (reminders.size() > 0) {
                        for (int i = 0; i < reminders.size(); i++) {
                            if (reminders.get(i).contains(time)) {
                                //One of the Strings in ArrayList reminders
                                //contains String representation of current
                                //time (along with the ID of database row).
                                //Here I will probably be starting a new
                                //Activity
                            }
                        }
                    }
                    minute++;
                    if (minute == 60) {
                        minute = 0;
                        hour++;
                    }
                    if (hour == 24) {
                        hour = 0;
                    }
                    sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        t.start();
    }
}

Кажется,чтобы работать нормально, но мне очень неудобно с этим решением.Мой первый вопрос: есть ли способ улучшить этот код?Могу ли я просто создать свои переменные int hour, int minute и ArrayList напоминания в самом Thread, а затем загрузить содержимое напоминаний непосредственно перед последовательностью цикла Thread?Таким образом, мне не нужно было бы использовать класс Application для хранения переменных, но мне нужно, чтобы они были глобальными, поток должен работать, даже когда я запускаю новые Activity в моем приложении, и он должен правильно хранить эти переменные.

Мой второй вопрос: если есть какой-то совершенно иной подход к этому, который вы бы порекомендовали.

Большое спасибо!


Я бы хотел добавить кое-что к моему вопросу.Поскольку я буду использовать AlarmManager, мне нужно будет установить повторяющиеся события более чем в одном действии.Поэтому мой вопрос заключается в том, должен ли я использовать разные экземпляры AlarmManager в каждом действии для добавления или удаления событий, или я должен использовать один и тот же экземпляр, который будет объявлен глобально?Спасибо.

1 Ответ

3 голосов
/ 31 марта 2012

AlarmManager - лучший выбор для периодического выполнения задачи, такой как проверка таблицы на наличие «напоминаний» и оповещение пользователя при необходимости. Причина в том, что поток не будет работать, когда процессор переходит в спящий режим. Вам нужен WakeLock, если вы хотите, чтобы ваша нить оставалась без сна, и это будет дорого по мощности. AlarmManager имеет оптимизации для этого.

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

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