2011-02-02 6 views
0

Я пытаюсь сделать небольшое приложение, которое имитирует кости. Я хочу, чтобы изображение стороны кости случайно менялось 6 раз после нажатия кнопки. Он должен случайным образом меняться 6 раз с задержкой 0,3 секунды после каждого случайного изменения. Проблема в том, что он меняется всегда только один раз не в шесть раз по желанию. Я предполагаю, что это будет просто какая-то тривиальная ошибка, но я не смог найти правильный ответ в любом месте в Интернете. Вот код, и я благодарю U все заранее:проблема с петлей и задержкой

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

+0

К сожалению, я не могу использовать return in onClick(); – klodye

ответ

3

onClick метод, который кружит через ваши кости изображений обратного вызова из системы. Это означает, что поток пользовательского интерфейса, который вызывает обратный вызов, будет работать только при возврате метода. И система не записывает то, что вы делаете внутри, а просто занимает последнее состояние (то есть последнее выбранное изображение).

Вы можете решить эту проблему с AsyncTask, где у вас есть doInBackground() (псевдо-код):

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

И в onProgressUpdate() вы можете отобразить изображение

+0

Я, наконец, сделал это любопытное произведение, но теперь случайные взгляды выглядят странно (иногда только два числа обмениваются несколько раз), а задержка не такая длинная, как хотелось. И обычно после запуска приложения, когда я нажимаю кнопку в первый раз, изображение меняется только один раз не так много раз, как хотелось бы – klodye

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();