Android Thread runOnUiThread

时间:2015-07-17 11:29:46

标签: java android multithreading android-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秒,就像我想要的那样:)

我该怎么办呢?

2 个答案:

答案 0 :(得分: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); 

答案 1 :(得分: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。您可以在Android上找到Animation and Graphics的指南。

使用这些按钮时,您可以停止动画,单击按钮并使用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);
}