循环和延迟问题

时间:2011-02-02 10:22:32

标签: android loops delay

我正在尝试制作一个模拟骰子的小应用程序。我希望骰子侧的图片在点击按钮后随机改变6次。每次随机变化后,应随机改变6次,延迟0.3秒。问题是它总是只改变一次而不是希望的六倍。我想这只是一些微不足道的错误,但我无法在网络上的任何地方找到正确的答案。这是代码,我提前感谢你们所有人:

   import java.util.Random;

import android.app.Activity;
import android.os.*;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class OneDice extends Activity{

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.onedicelayout);


        final ImageView image = (ImageView) findViewById(R.id.OneDiceRollImage);
        final int[] arrayOfDices = {
                R.drawable.icon,
                R.drawable.icon2,
                R.drawable.icon3,
        };
        final Random rand = new Random();

        View.OnClickListener rollOneDiceListener = new View.OnClickListener() {

            @Override
            public void onClick(View v){
                int j = 0;
                for(int i = 0; i<6; i++){
                    try {
                        j = rand.nextInt(3);
                        image.setImageResource(arrayOfDices[j]);
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        Button oneDiceRollButton = (Button) findViewById(R.id.OneDiceRollButton);
        oneDiceRollButton.setOnClickListener(rollOneDiceListener);

    }

}

2 个答案:

答案 0 :(得分:3)

圈出骰子图片的onClick方法是来自系统的回调。 这意味着调用回调的UI线程只会在方法返回时再次运行。并且系统不记录您在内部执行的操作,而是记录最后一个状态(即最后选择的图像)。

您可以使用AsyncTask解决此问题,其中doInBackground()(伪代码):

for (int i = 0; i< 6 ; i++) {
   publishProgress(randomNumber);
   Thread.sleep(300);
}

然后在onProgressUpdate()中,您可以显示图片

答案 1 :(得分:0)

我不知道这是不是一种正确的方式,但它确实有助于我逐步展示物体。

new Thread(new Runnable() {

                @Override
                public void run() {
                    for(int i = 0;i<diceNum;i++){
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                            //do your Ui task here
                                                    }
                        });

                        try {

                            Thread.sleep(500);

                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
//              }

                }
            }).start();