Синхронизация событий Android (тосты и намерения)

#android #android-activity #timing #toast

#Android #android-активность #синхронизация #тост

Вопрос:

Я пытаюсь явно запустить намерение для нового действия, но я хотел бы, чтобы сначала был завершен некоторый код в текущем действии. Я провел небольшое исследование, и у меня есть пара идей для достижения этого, но я думаю: «должен быть более простой способ сделать это». Вот соответствующий блок кода:

         cpuToast(dmg);
        if (player_.getStatus() == false)
        {
            playerWon_ = false;
            Intent intent = new Intent(Main.this, Death.class);
            startActivity(intent);
        }
  

dmg — это int. cpuToast просто создает строку для отображения урона, а затем вызывает show() . GetStatus() возвращает, был ли игрок убит или нет. В случае, если игрок был убит, я запускаю новое намерение, которое воспроизведет анимацию смерти игрока. К сожалению, действие «Death» запускается еще до того, как тост становится видимым, а затем оно становится видимым во время действия Death, которого я не хочу.

Кто-нибудь знает простой способ убедиться, что Toast выполняется полностью перед запуском операции Death? Из того, что я нашел, похоже, что мне придется создать объект «Timer», когда на самом деле все, что мне нужно, это простой цикл while типа «while (Toast.isVisable) {}», чтобы связать выполнение на пару секунд.

Ответ №1:

Некоторый пример кода для обновления пользовательского интерфейса в ответ на синхронизированные события можно найти по адресу http://developer.android.com/resources/articles/timed-ui-updates.html .

Ответ №2:

Во время начала тостов вы также можете опубликовать отложенное сообщение для своего текущего действия; запуск этого отложенного сообщения может запустить новое намерение.

Комментарии:

1. Спасибо, это больше похоже на решение, которое я ищу. Не могли бы вы опубликовать какой-нибудь пример кода?

2. У меня нет урезанного примера, но в developer.android.com/reference/android/os/Handler.html вы можете найти метод postDelayed(). Укажите в нем runnable и время задержки; ваш runnable будет выполнен примерно в это время. Если вам нужно опубликовать запускаемое из чего-то другого, кроме вашего потока пользовательского интерфейса, ваш поток пользовательского интерфейса может создать новый обработчик () и передать его в службу / etc., И этот код потока, не относящийся к пользовательскому интерфейсу, может использовать handler.postDelayed() .

Ответ №3:

Обязательно ли это должен быть тост?

Если вы согласны с идеей использования пользовательского диалогового окна (удаленный заголовок, кнопки и т.д.), Это, вероятно, ваш лучший выбор. Используйте обработчик, чтобы закрыть диалоговое окно по истечении заданного времени и начать новое действие.

Комментарии:

1. Это не обязательно должен быть тост, но я думаю, что мне в любом случае нужна пауза перед новым действием. Также будет выполняться анимация, которая также должна быть полностью выполнена до запуска этого действия. Знаете ли вы способ сделать паузу, отличную от «Thread. Sleep()»? Я пытался использовать этот метод, но он также приостановил выполнение моей анимации.