2015-03-13 8 views
0

В моем методе onTouchEvent (в классе, который расширяет Activity), у меня есть некоторые изображения, которые меняются один за другим, что делается путем ожидания немного перед выполнением следующего изменения.Обновление imageViews in onTouchEvent в реальном времени

//in the onTouchEvent method 
//ivList is an arrayList of imageViews 
ivList.get(0).setImageResource(R.drawable.drawable1); 
synchronized (this) { 
    try { 
     wait(500); 
    } catch (InterruptedException e) { 
    } 
} 
ivList.get(1).setImageResource(R.drawable.drawable2); 

Однако, когда это выполняется, то изменения происходят только один раз onTouchEvent заключен, так что результат является незначительной задержкой, а затем оба imageViews изменить сразу, в отличие от одного ImageView изменения, незначительные задержки, а затем меняется второй. Может кто-нибудь объяснить, как это исправить?

+0

Какие параметры выполняет метод 'wait()'? –

+0

Параметр (длительный таймаут). http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html – IntegralOfTan

+0

500? Как долго вы хотите, чтобы задержка была ... она принимает параметр в миллисекундах, поэтому 500 близок к человеческому глазу. Вы просто пытаетесь предотвратить блокировку потока? –

ответ

0

Проблема заключается в том, вы не должны использовать ожидание(), так как он будет блокировать основной поток

ivList.get(0).setImageResource(R.drawable.drawable1); // this is doing in main thread 
synchronized (this) { 
    try { 
     wait(500); // this blocks the main thread 
    } catch (InterruptedException e) { 
    } 
} 
ivList.get(1).setImageResource(R.drawable.drawable2); // this is also doing in main thread 

попробовать следующие

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     ivList.get(1).setImageResource(R.drawable.drawable2); 
    } 
}; 
ivList.get(0).setImageResource(R.drawable.drawable1); 
// no synchronized is needed 
new Handler().postDelayed(r,500); // call to change the image after 500s 

причины вашей Runnable и Обработчик может создать еще где так, что вы не нужно создавать их каждый раз, когда onTouchEvent задействован

хорошо, если вы собираетесь заставить его работать на 10 изображений.

// these are local variables 
//create a contant int array for the 10 images 
int[] imgs = {R.drawable.drawable1 , R.drawable.drawable2 ,....,R.drawable.drawable10}; 
int count = 0; // counting which image should show 
// local variable ends 

// initialize 
Handler handler = new Handler(); 
Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      if (count < 9){ 
       count++; 
       ivList.get(count).setImageResource(imgs[count]); 
       handler().postDelayed(r,500); 
      } 
     } 
    }; 

// in your touch event 

ivList.get(0).setImageResource(R.drawable.drawable1); 
// no synchronized is needed 
handler().postDelayed(r,500); // call to change the image after 500s 
+0

Что бы я сделал, если бы захотел сделать это с помощью 10 imageViews? – IntegralOfTan

+0

Вы имеете в виду 1 из 1 на 10 изображений? –

+0

Да, мне нужно будет каждый раз создавать отдельные runnables? – IntegralOfTan

Смежные вопросы