#java #multithreading #blackberry #java-me
#java #многопоточность #ежевика #java-me
Вопрос:
Я хочу автоматически запланировать поток с определенным интервалом времени. Мне также нужно постоянно выполнять это в фоновом режиме без зависания устройства.
Я пробовал это с классом Application Manager, но это для планирования приложений, и мне нужно запланировать поток внутри приложения.
Ответ №1:
Я бы использовал TimerTask:
public class MyScreen extends MainScreen {
private Timer mTimer;
public MyScreen() {
mTimer = new Timer();
//start after 1 second, repeat every 5 second
mTimer.schedule(mTimerTask, 0, 5000);
}
TimerTask mTimerTask = new TimerTask() {
public void run() {
// some processing here
}
};
}
Ответ №2:
используйте UiApplication.getUiApplication().invokeLater()
он принимает параметры delay и repeat и будет выполнять именно то, что вам нужно.
Редактировать
Я знаю, что этот пост старый, но это, безусловно, лучший вариант для планирования повторяющихся событий, и я хотел бы добавить, что для остановки запланированного события требуется следующее:
//Start repeating "runnable" thread every 10 seconds and save the event ID
int eventId = UiApplication.getUiApplication().invokeLater(runnable, 10000, true);
//Cancel the repetition by the saved ID
UiApplication.getUiApplication().cancelInvokeLater(eventId);
Комментарии:
1. Верно, но есть ли способ, которым этот поток начинает выполняться после выхода из приложения с заданной задержкой, например, с задержкой в 1 день.
2. вы могли бы добавить UIApplication.getUiApplication().requestBackground(); в вашем переопределенном методе OnClose(), чтобы оставить приложение запущенным в фоновом режиме, но (afaik) любой поток, который вы запускаете с точки зрения контекста приложения, будет остановлен после его надлежащего закрытия, включая запланированные потоки.
Ответ №3:
Предполагая, что вы хотите, чтобы он запускал поток при запуске устройства: создайте второй проект и укажите его в качестве альтернативной точки входа. В вашем UIApplication или Приложении main() проверьте аргумент, переданный проекту. Выполняйте свои периодические действия там через Thread.sleep и не вызывайте enterEventDispatcher.
найдите «автозапуск»: http://docs.blackberry.com/en/developers/deliverables/1076/development.pdf
Или, если вы хотите что-то сделать, как только пользователь «запустит» это, тогда рассмотрите возможность создания нового потока для выполнения ваших временных задач. Переопределите OnClose() вашего экрана и используйте Application.getActivation().deactivate(), чтобы перевести экран в фоновый режим.
Или есть другие способы сделать что-то подобное, например invokeLater и т.д. Возможно, eventlisteners могут делать то, что вам нужно, но вы не предоставили много подробностей.
Ответ №4:
Пока приложение запущено — просто создайте поток и после каждого этапа работы вызывайте Thread.sleep столько, сколько вам нужно, чтобы он оставался бездействующим.
Если вам нужно, чтобы он включался в определенное время, а не просто спал в течение определенного времени, тогда вы можете сделать что-то вроде следующего:
Date wakeUpAt = ...; // Get this however
Date now = new Date();
long millisToSleepFor = wakeUpAt.getTime() - now.getTime();
Thread.sleep(millisToSleepFor);
Комментарии:
1. Спасибо, но в режиме ожидания он зависает на определенное время (длительное время сна).
2. Вы хотите сказать, что пока поток находится в спящем режиме, устройство не планирует никаких других потоков? Весь смысл sleep() заключается в том, что поток не запланирован на процессоре на этот промежуток времени…