Как установить изображение с задержкой

У меня есть «Активность» с тремя изображениями. При нажатии на одно изображение все изображения переключаются на другое изображение. Есть ли способ сделать переключатели такими, чтобы была 2-секундная задержка перед фактическим изменением изображений (т.е. 2-секундная задержка в каждом цикле for ниже)? Я пытаюсь сделать это с помощью таймера, но на самом деле это не приводит к задержке при запуске моей программы:

protected void onCreate(Bundle savedInstanceState) {
image1.setOnClickListener(this);

@Override
public void onClick(View arg0) 
{
do_switches();
}

private void do_switches() 
{
//loop through all images and change them
for(int j=1 ;j<=3; j++)
{           


 final int curr2=current;
 final Handler handler = new Handler(); 
 Timer t = new Timer(); 
 t.schedule(new TimerTask() { 
       public void run() { 
        handler.post(new Runnable() { 
               public void run() { 

        switch(curr2){

        case 1:

            image1.setImageResource(ImageArray[1]);
                    break;

        case 2:

            image2.setImageResource(ImageArray[2]);
                             break;

        case 3:
            image3.setImageResource(ImageArray[3]);
                        break;

        }
            } 
        }); 
    } 
 }, 2000); 
}

}

Я также пытался использовать только SystemClock.sleep(2000) вместо таймера, но это тоже не сработало. Я также безуспешно пытался настроить поток с помощью try/catch или, возможно, я не реализовал его должным образом. Есть ли способ поставить эту задержку на каждую итерацию моего цикла for? Спасибо


person Tobi    schedule 08.05.2011    source источник


Ответы (2)


Не лучший вариант, но все же вы можете попробовать CountDownTimer.

http://developer.android.com/reference/android/os/CountDownTimer.html

person Zoombie    schedule 09.05.2011
comment
Сначала я сохраняю последовательность изображений для изменения в массиве, а затем использую таймер обратного отсчета, чтобы фактически изменить изображения. Но когда я делаю свой интервал небольшим числом (менее ~ 2000 мс), он пропускает последние 1 или 2 слота моего массива. Вы знаете, что может быть причиной этого? - person Tobi; 18.05.2011

Вы можете использовать handler.postDelayed(Runnable r, long timeInMillis). Сделайте свой runnable, который меняет изображения, а затем вызовите postDelayed() и передайте runnable и 2000 для временной задержки.

Редактировать: Ааа, я вижу, что вы пытаетесь сделать. Насколько я знаю, вы не сможете делать паузу в цикле for на 2 секунды каждый раз. Вы можете получить тот же эффект, если свяжете вызовы postDelayed(). Просто настройте следующий runnable и вызовите для него postDelayed() внутри первого и то же самое для третьего внутри второго. Вы получите ту же функциональность, что и цикл for, который приостанавливается на 2 секунды на каждой итерации.

person FoamyGuy    schedule 08.05.2011
comment
Я только что попытался сделать то, что вы сказали, но мой цикл for все еще переходит к следующей итерации, хотя две секунды еще не истекли. Как я могу заставить текущую итерацию цикла for ждать, пока не пройдет 2 секунды, прежде чем она продолжится? - person Tobi; 09.05.2011
comment
В моем случае я буду вызывать один и тот же runnable несколько раз. Как бы я это сделал? - person Tobi; 18.05.2011