В моем приложении есть база данных, в которой я храню что-то вроде напоминания.Один из столбцов представляет собой строковое представление времени, в которое напоминание должно быть «напоминано», например: чч: мм.Я создаю тему в своей основной деятельности, чтобы регулярно отслеживать все напоминания и проверять, пора ли устанавливать тревогу.Прежде чем создать этот поток, я загружаю времена + идентификаторы всех строк базы данных в 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 в каждом действии для добавления или удаления событий, или я должен использовать один и тот же экземпляр, который будет объявлен глобально?Спасибо.