循环和延迟问题

问题描述:

我想做一个模拟骰子的小应用程序。点击按钮后,我希望骰子边的图片随机更改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); 

    } 

} 
+0

我试过你的代码,在Android之外,随机数和等待工作正常。我只能假设这个问题与setImageResource方法有关 - 也许它没有足够的时间来更新图像?尝试添加一个返回值,以便循环在下一次迭代之前等待该方法完成。 – Mikaveli 2011-02-02 10:42:06

+0

不幸的是我不能在onClick()中使用return。 – klodye 2011-02-02 16:14:54

,通过你的骰子图像都市圈的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();