Замедление графического интерфейса в Android

Мое приложение для Android работает нормально, за исключением конечной последовательности. Это игра, и в конце на экране отображается счет:

TextView allscores = new TextView(this);

allscores.setText("Your score: "+ mypoints);

Затем я хочу, чтобы графический интерфейс замедлился на несколько секунд, чтобы у пользователя было время воспринять информацию. Может быть, 2 или 3 секунды хватит.

try {
                Thread.sleep(3000);

            } catch (InterruptedException e) {

                e.printStackTrace();
            }

                            layout.removeAllViews();

Имейте в виду, я новичок в программировании потоков. Все это делается в потоке пользовательского интерфейса, у меня нет других запущенных потоков. Затем я добавляю финальную концовку экрана-заставки:

AnView animator = new AnView(this);

            layout.addView(animator);

где AnView - это мое собственное расширение View.

В целом он отлично работает. Проблема в том, что нить спит на 3 секунды, не показывая моего окончательного результата. Не знаю почему. Не знаю, почему он не показывает мой окончательный счет перед сном. На самом деле он становится пустым, что означает, что он удалил все просмотры, а затем перешел в режим сна.


person Community    schedule 19.12.2010    source источник
comment
Возможно, ответы на этот вопрос помогут вам: stackoverflow.com/questions/4203579/ команда сна для Android   -  person Curd    schedule 19.12.2010


Ответы (4)


Вы не видите оценку, потому что спящий режим в потоке пользовательского интерфейса предотвращает операции макета и рисования, которые делают видимыми изменения текста. Никогда не спите в потоке пользовательского интерфейса.

Использование нового потока для этого излишне. Используйте Handler и метод postDelayed, чтобы что-то произошло после задержки.

private final Handler mHandler = new Handler();

Потом, когда захочешь сделать что-нибудь позже,

mHandler.postDelayed(new Runnable() {
    public void run() {
        doDelayedThing();
    }
}, 3000);
person adamp    schedule 19.12.2010

Как указывали другие: не используйте sleep в потоке пользовательского интерфейса.

Что вам следует делать вместо этого, описано здесь:

http://developer.android.com/guide/appendix/faq/commontasks.html#threading

в разделе «Обработка дорогостоящих операций в потоке пользовательского интерфейса»

person Curd    schedule 19.12.2010

Не рекомендуется когда-либо переводить в спящий режим основной поток пользовательского интерфейса. Попробуйте что-то вроде этого:

new Thread (new Runnable () {// здесь работаем});

Или вы можете попробовать использовать всплывающее окно с тостами для оценки.

person Realn0whereman    schedule 19.12.2010
comment
Действительно? Мне посоветовали выполнять большую часть работы по программированию графического интерфейса пользователя в потоке пользовательского интерфейса. Есть причина не спать? - person ; 19.12.2010
comment
Прочтите пару строк ниже, когда речь идет об однопоточной модели developer.android. com / resources / article / Я подозреваю, что вы засыпаете поток пользовательского интерфейса, и он даже не может отображать представление. - person Realn0whereman; 19.12.2010
comment
Почему бы просто не использовать слушателя, чтобы прослушать какой-то ключ от пользователя, а затем перейти к экрану-заставке? Таким образом, вам удастся дать пользователю все время, необходимое ему для просмотра результатов, а также использовать один и тот же поток, сохраняя при этом его отзывчивость, поскольку вы используете только слушателя для работы. - person Luis Miguel Serrano; 19.12.2010

Вы также можете использовать таймер, чтобы подождать 3 секунды, что запустит новый поток по истечении времени.

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
                AnView animator = new AnView(this);
                layout.addView(animator);
    }
}, 3000);
person martinpelant    schedule 19.12.2010