Как я могу запланировать определенный поток в Blackberry

#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
        }
    };
}
  

смотрите Скрытые жемчужины BlackBerry API (часть вторая)

Ответ №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() заключается в том, что поток не запланирован на процессоре на этот промежуток времени…