循环和延迟问题
问题描述:
我想做一个模拟骰子的小应用程序。点击按钮后,我希望骰子边的图片随机更改6次。在每次随机变化之后,它应该随着0,3秒的延迟随机改变6次。问题在于它总是只有一次改变,而不是六次。我想这只是一个微不足道的错误,但我无法在网络上的任何地方找到正确的答案。下面是代码,我感谢ü所有提前:循环和延迟问题
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);
}
}
答
,通过你的骰子图像都市圈的onClick
方法是从系统的回调。 这意味着调用回调的UI线程只会在方法返回时再次运行。系统没有记录你在内部正在做什么,而只是记录了最后一个状态(即最后选择的图像)。
您可以用AsyncTask
,你有doInBackground()
(伪代码)解决这个问题:
for (int i = 0; i< 6 ; i++) {
publishProgress(randomNumber);
Thread.sleep(300);
}
并在onProgressUpdate()
然后可以显示图像
答
我不知道这是一个正确的方法或不,但它确实有助于我逐步显示对象的移动。
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();
我试过你的代码,在Android之外,随机数和等待工作正常。我只能假设这个问题与setImageResource方法有关 - 也许它没有足够的时间来更新图像?尝试添加一个返回值,以便循环在下一次迭代之前等待该方法完成。 – Mikaveli 2011-02-02 10:42:06
不幸的是我不能在onClick()中使用return。 – klodye 2011-02-02 16:14:54