проблема петли и задержки - PullRequest
       21

проблема петли и задержки

0 голосов
/ 02 февраля 2011

Я пытаюсь сделать небольшое приложение, которое имитирует кости. Я хочу, чтобы изображение стороны игральных костей случайным образом менялось 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 ]

3 голосов
/ 02 февраля 2011

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

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

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

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

0 голосов
/ 08 марта 2013

Я не знаю, это правильный путь или нет, но он помог мне показать движение объекта шаг за шагом.

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