Замедление графического интерфейса в Android - PullRequest
1 голос
/ 19 декабря 2010

Мое приложение 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 секунд, не показывая мой окончательный счет.Я не знаю почему.Я не знаю, почему это не показывает мой окончательный счет перед сном.Это фактически гаснет, указывая, что он удалил все представления и затем спал.

Ответы [ 4 ]

3 голосов
/ 19 декабря 2010

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

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

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

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

3 голосов
/ 19 декабря 2010

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

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

private final Handler mHandler = new Handler();

Тогда, когда вы захотите что-то сделать позже,

mHandler.postDelayed(new Runnable() {
    public void run() {
        doDelayedThing();
    }
}, 3000);
1 голос
/ 19 декабря 2010

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

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
                AnView animator = new AnView(this);
                layout.addView(animator);
    }
}, 3000);
1 голос
/ 19 декабря 2010

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

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

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

...