Как у вас есть код паузы на пару секунд в Android? - PullRequest
38 голосов
/ 06 ноября 2010

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

Заранее спасибо!

Я должен отметить, что я пытался использовать wait (введите номер здесь); но затмение говорит мне, что это вызывает ошибку перехвата стека или что-то в этом роде и выдает исключение, таким образом ничего не делая: (

Ну, это интересно, (способ, которым я запрограммировал вещи, "по меньшей мере, интересен"), я сделал Thread.sleep (5000) и бросил его под уловом попытки, он спит в течение 5 секунд и затем продолжает делать код. Однако мои обновления в представлениях не отображаются до тех пор, пока я не нажму кнопку (действительно ненавижу программирование, управляемое событиями).

1 Ответ

96 голосов
/ 06 ноября 2010

Умение мыслить в терминах событий - вот ключ к успеху.Ты можешь это сделать.:)

Первое правило: никогда не останавливайте поток пользовательского интерфейса.Поток пользовательского интерфейса отвечает за поддержание чувствительности вашего приложения.Любая работа, которую вы там делаете, не должна блокироваться;делай то, что тебе нужно, и возвращайся как можно быстрее.Определенно избегайте ввода-вывода в потоке пользовательского интерфейса.(Есть некоторые места, где вы не можете помочь, из-за требований жизненного цикла, например, сохранение состояния приложения в onPause.) Если вы когда-либо вызываете Thread.sleep в потоке пользовательского интерфейса, который вы делаетенеправильно.

Android применяет это с ошибкой «Приложение не отвечает» (или «ANR»), которую видит пользователь.Всякий раз, когда вы видите это в приложении для Android, это означает, что разработчик сделал что-то, из-за чего поток пользовательского интерфейса слишком долго зависал.Если устройство действительно по какой-то причине зависло, эта ошибка может не являться ошибкой разработчика приложения, но обычно это означает, что приложение делает что-то не так.

Вы можете использовать эту модель в своих интересах, опубликовав свою собственнуюСобытия.Это дает вам простой способ сказать вашему приложению «сделайте это позже».В Android ключ к публикации собственных событий находится в классе Handler.Метод postDelayed позволяет запланировать Runnable, который будет выполняться через определенное количество миллисекунд.

Если у вас есть действие, которое выглядит примерно такthis:

public class MyActivity extends Activity {
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler.postDelayed(new Runnable() {
            public void run() {
                doStuff();
            }
        }, 5000);
    }

    private void doStuff() {
        Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
    }
}

Через 5 секунд после создания упражнения вы увидите тост, созданный в doStuff.

Если вы пишете пользовательский View, это еще проще.Представления имеют свой собственный метод postDelayed, который будет публиковать все в правильном Handler, и вам не нужно создавать свой собственный.

Второе правило: Представления должны *Только 1035 * можно изменить в потоке пользовательского интерфейса.Те исключения, которые вы получаете и игнорируете, означают, что что-то пошло не так, и если вы проигнорируете их, ваше приложение, вероятно, начнет плохо себя вести интересным образом.Если ваше приложение выполняет большую часть своей работы в других потоках, вы можете post событий напрямую в представление, которое вы хотите изменить, чтобы изменения выполнялись правильно.

Если у вас есть ссылкак вашему Activity из этой части вашего кода вы также можете использовать Activity#runOnUIThread, что точно соответствует названию.Вы можете предпочесть такой подход, если публикация в одном представлении не имеет смысла в контексте.

Что касается обновлений представлений, которые не появляются, пока вы не нажмете кнопку, что это за виды?Это пользовательские виды, которые рисуют эти обновления?Если да, то вы не забыли позвонить invalidate после изменения данных, чтобы вызвать перерисовку?Представления перерисовываются только после того, как они были признаны недействительными.

...