Из вашего описания звучит так, что когда вы хотите запустить цепочку действий, вы в основном запускаете их все сразу, каждое с некоторой фиксированной задержкой.Это довольно хрупко - если вы измените продолжительность одного из действий, оно может больше не синхронизироваться с чем-то, что должно произойти после него.
Более надежный подход - использовать Observer.Узор .Каждое действие может иметь событие onCompleted()
(и / или различные другие события, в зависимости от характера действия), которое можно использовать для запуска начала следующего действия.
Например, скажем,что, когда пользователь нажимает кнопку выбора элемента меню, вы хотите следующую последовательность событий:
- Воспроизвести анимацию выбранного элемента.
- Когда 1 закончится, перейдите на текущий экранвыкл.
- Когда закончится 2, включите следующий экран.
Похоже, вы делаете что-то вроде этого:
void onItemSelected(MenuItem menuItem) {
runNow(new SelectedItemAnimationHandler(menuItem)); // Takes 500ms
// Delay for 500ms to wait until end of selection anim.
postDelayed(new ScreenTransitionOffHandler(currentMenu), 500); // Takes 1000ms
// Delay for 1500ms to wait until end of transition off.
postDelayed(new ScreenTransitionOnHandler(nextMenu), 1500);
}
Возможно, выобъедините в цепочку события, создав действия (которые выполняют роль субъекта в шаблоне Observer) и ActionObservers (которые выполняют роль наблюдателя):
void onItemSelected(MenuItem menuItem) {
// Set up the actions
// Actions call onCompleted() on any observers when they complete.
SelectedItemAnimationAction sa = new SelectedItemAnimationAction(menuItem);
ScreenTransitionOffAction stoff = new ScreenTransitionOffAction(currentMenu);
ScreenTransitionOnAction ston = new ScreenTransitionOnAction(nextMenu);
// Add some observers to the actions
sah.addOnCompletedHandler(new ActionObserver() {
public void onCompleted() {
stoff.start();
}
});
stoff.addOnCompletedHandler(new ActionObserver() {
public void onCompleted() {
ston.start();
}
});
// Start the first action
sa.start();
}
Таким образом, вам не нужно указыватьпродолжительность SelectedItemAnimationHandler при настройке ScreenTransitionOffHandler.
EDIT: попытался сделать реализацию шаблона Observer более понятной.РЕДАКТИРОВАНИЕ 2: изменен runNow (действие) на action.start ()