Диагностика на основе исходного вопроса:
Ваш первый шаг должен состоять в том, чтобы прочитать документацию для Timer и TimerTask, которая дает следующие условия для IllegalStateException
при schedule(...)
:
Если поток выполнения задачи таймера неожиданно завершается, например, из-за вызова его метода остановки, любая дальнейшая попытка запланировать задачу на таймере приведет к исключению IllegalStateException, как если бы отмена таймераметод был вызван.
Вы когда-нибудь .stop()
?Ты когда-нибудь звонил cancel()
?Можете ли вы проверить, не вызвало ли задание исключение, которое внезапно завершило поток Timer
?Вы используете тот же Timer
для других TimerTask
с?Вы им доверяете?
Попробуйте обернуть свою логику TimerTask
широким обработчиком исключений и попросите ее напрямую отчитаться, чтобы увидеть, есть ли внутреннее непредвиденное исключение, которое приведет к сбою следующего вызова schedule
какописано.
Кроме того, придирка, но важная: передовая практика, когда задаешь вопрос, который включает в себя «Почему я получил это исключение?»должен включать полное исключение и вывод трассировки стека.Вы получите гораздо более качественные ответы, и вам больше не придется читать этот текст, а затем придется заново редактировать свой вопрос и т. Д.
Руководство по вашей конкретной ошибке:
Хорошо, прочитайте заявление об исключении.Похоже, вы расстроили движок пользовательского интерфейса.Таким образом, у вас есть две проблемы:
Вы расстроили поток таймера, передав ему задачу, которая разрывается с необработанным исключением.Хорошая политика - обернуть эти вещи в блок try/catch
, где операция catch
равна не менее , чтобы напечатать или записать трассировку используемого стека и повторно выдать исключение.
Вы расстроили логику событий пользовательского интерфейса, см. Ниже ...
Я не знаю пользовательский интерфейс Blackberry, но, вероятно, то, что вы пытаетесь сделать, нужнобыть сделано в цикле событий GUI.Эта запись KB должна помочь.А еще лучше, прочитайте документацию API .Вам нужно удерживать блокировку графического интерфейса, как в Swing, для вызова pushScreen()
.Один из способов сделать это - изменить свой код для звонка через invokeLater()
или invokeAndWait()
.
Код кандидата
Это не проверено, как я никогда и не делалЯ не планирую заниматься какой-либо разработкой BlackBerry, но, по-моему, она совпадает с опубликованным API-интерфейсом BlackBerry, FWIW.Попробуйте что-то вроде этого:
TimerTask splashTask = new TimerTask()
{
public void run() {
final UiApplication uia = UiApplication.getUiApplication();
final Object eventLock = uia.getEventLock();
synchronized(eventLock) {
uia.pushScreen(new HomeNavigationScreen());
}
}
};
timer.schedule(splashTask, 3000);
или, что менее вероятно, приведет к проблемам с синхронизацией и потенциальным взаимоблокировкам:
TimerTask splashTask = new TimerTask()
{
public void run() {
final UiApplication uia = UiApplication.getUiApplication();
uia.invokeLater(new Runnable() {
public void run() {
uia.pushScreen(new HomeNavigationScreen());
});
}
}
};
timer.schedule(splashTask, 3000);