我正在尝试制作一个模拟骰子的小应用程序。我希望骰子侧的图片在点击按钮后随机改变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);
}
}
答案 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();