2015-07-17 3 views
0

Я хочу создать простую игру с одним изображением и двумя кнопками, чтобы угадать, если карта красная от черного.Android Thread runOnUiThread

Я хочу использовать поток, за каждые 0,1 секунды до того, как игрок нажмет кнопку, карта меняется.

это то, что я использовал до сих пор:

Thread timer = new Thread() { 
     public void run() { 
      while (true) { 
       try { 
        if(!isInterrupted()) 
         sleep(100); 
        else 
         sleep(5000); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          if(!isInterrupted()) { 
           if (iv_card_to_Guess.getDrawable() == null) 
            iv_card_to_Guess.setImageBitmap(deck_card); 
           else 
            iv_card_to_Guess.setImageDrawable(null); 
          } 
          else { 
//here need to update imageview with the actual image of the card, not just the deck or null 
// for example 5 of Hearts 

           loadBitmap(getResourceID("img_" + numbers.get(count).toString(), "drawable", getApplicationContext()), iv_card_to_Guess); 
          } 
         } 
        }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 
    }; 

Когда я нажимаю кнопку я называю timer.interrupt();

Приложение изменяет изображение реальной карты, но и в течение 0,1 секунд, а не в течение 5 секунд , как я хочу :)

Как я могу это сделать, пожалуйста?

+0

См http://stackoverflow.com/questions/7142665/why-does-thread-isinterrupted-always-return-false – tynn

+0

вы можете показать мне немного кода? я очень новичок в разработке Android –

ответ

0
 private Timer timer; 
     TimerTask task = new TimerTask() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      insert the code you want to trigger here. 
     } 
    }; 
    timer = new Timer(); 

    int delay=5000; 

    timer.schedule(task, delay); 
0

То, что вы делаете, вводит некоторые неопределенности. Я не уверен в точности выполнения, но если isInterrupted() возвращает true, и вы вызываете sleep(5000), то InterruptedException может быть немедленно выброшен без сна. Далее Runnable в основном потоке может запускаться до того, как прерванное состояние будет чистым, так что ваша карта будет выглядеть так, как предполагалось, просто для удаления на следующей итерации вашего цикла while, который просачивается только на 0,1 секунды.

Так вместо того, чтобы вы могли лучше использовать в Android анимации для мигающего эффекта сделано с

if (iv_card_to_Guess.getDrawable() == null) 
    iv_card_to_Guess.setImageBitmap(deck_card); 
else 
    iv_card_to_Guess.setImageDrawable(null); 

Лучший ввести два метода startAnimation() и stopAnimation для этого. Вы можете найти руководство для Animation and Graphics на Android.

С их помощью вы можете остановить анимацию, когда ваша кнопка нажата и запустите ее снова, используя View.postDelayed(run, delay), чтобы дать вашей карте время экспозиции 5 секунд.

public void onClick(View v) { 
    stopAnimation(); 
    loadBitmap(getResourceID("img_" + numbers.get(count).toString(), "drawable", getApplicationContext()), iv_card_to_Guess); 
    iv_card_to_Guess.postDelayed(new Runnable() { 
     startAnimation(); 
    }, 5000); 
} 
Смежные вопросы