Как мне заставить ждать / спать работать так, как я хочу в Java? - PullRequest
1 голос
/ 19 октября 2011

Я пытаюсь сделать что-то очень простое. Сначала загрузите мой макет (main.xml). Затем подождите 1 секунду, измените изображение, подождите 1 секунду и измените его на третье изображение. (Моя конечная цель, конечно, более сложная, но я даже не могу заставить ее работать).

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

super.onCreate(savedInstanceState);
setContentView(R.layout.main);        

ImageCard[0] = (ImageView)findViewById(R.id.imageView11);
Thread.sleep(1000);
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.secondimage));
Thread.sleep(1000);
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.thirdimage));

ImageCard [0] - это изображение, которое я пытаюсь изменить. Он загружается в main.xml и показывает нормально, если я удаляю остальную часть кода.

Если я изменю время ожидания на 5000, то потребуется 10 секунд, прежде чем он наконец отойдет от черного экрана и покажет третье изображение. Вот откуда я знаю, что это не просто медленная загрузка, а то, что она на самом деле ждет.

Как будто он не работает последовательно. Я не эксперт по Java, поэтому я предполагаю, что делаю что-то глупое ...

Спасибо за любую помощь!

Ответы [ 5 ]

3 голосов
/ 20 октября 2011

Я думаю, что вы блокируете UI Thead.Попробуйте Handler.postDelayed для статического объекта Handler.

2 голосов
/ 19 октября 2011

Хорошо, вот твоя проблема, ты никогда не можешь заснуть (...), когда ты в UIThread.UIThread никогда не предполагается заблокированным, он вызывает много очень плохих вещей, происходящих в Android.Но есть очень простой способ обойти это, просто сойти с UIThread и отскочить обратно, когда вам это нужно.Вот что я бы порекомендовал:

public void onCreate(...)
{
    super.onCreate(...);
    myActivity.setContentView(R.layout.main);
    new Thread(this).start();
}

public void run()
{
    try
    {
        changeLayout(R.layout.main2);
        Thread.sleep(5000);
        changeLayout(R.layout.main3);
        Thread.sleep(10000)
        changeLayout(R.layout.main4);
    }catch(Exception e){}
}

public void changeLayout(int id)
{
    this.id = id;
    myActivity.post(new Runnable()
    {
        public void run()
        {
            myActivity.setContentView(id);
        }
    });
}

private int id;

Конечно, с этим примером ваш класс должен реализовать Runnable для работы.Только UIThread может получить доступ к интерфейсу, никакой другой поток не может.Вот почему вы должны прыгать и выключать UIThread.Надеюсь, это сработало!

0 голосов
/ 20 октября 2011

у вас есть этот код в конструкторе или в функции init ()? если да, нарисуйте только первое изображение, и функция Thread.sleep () переместится после места, из которого был вызван конструктор или функция init (). затем вызовите функцию repaint () или что-то в этом роде.

0 голосов
/ 19 октября 2011

Я думаю, что Hovercraft Full of Eels указывает вам правильное направление.По сути, вы не выполняете многопоточность, вы говорите основному потоку подождать, что означает, что он никогда не завершает рисование.Я не уверен насчет Android, но Swing по умолчанию использует двойную буферизацию (чтобы избежать мигания экрана), но это означает, что то, что рисуется, на самом деле рисуется в буфере, а не в самом окне, поэтому вы этого не делаетевижу ничего.Вы можете попробовать отключить двойную буферизацию (которую, вероятно, использует Android), но это может вызвать другие проблемы.

Возможно, вы захотите сделать многопоточность, или, я уверен, в Android скорее всего есть компонент Timer.Если это так, я бы посоветовал вам использовать его поверх Thread.sleep или для реальной многопоточности.Используя таймер, вы можете запустить событие через одну секунду.Это событие выполнит другой код.

0 голосов
/ 19 октября 2011

Попробуйте добавить ImageCard [0] .invalidate (), когда хотите, чтобы он рисовал.

...