Управление скоростью выполнения цикла в java - Android

Я знаю, что это очень маленький вопрос. Но я не могу понять причину этого. В моей программе я запускаю цикл 50 раз. Внутри цикла я генерирую случайное целое число от 0 до 5 и загружаю изображение (изображение в кости) в imageView. Таким образом, imageView должен быстро меняться, и я должен видеть, как быстро меняется какое-то визуальное значение, например, значение кости.

Но я не мог видеть никаких таких изменений в imageView, и в конце цикла imageView меняется сразу. Я имею в виду, что если начальное значение кости равно 2, оно остается в двух до тех пор, пока цикл не завершится, а затем imageView внезапно изменится на 5 или какое-то значение, подобное этому .

Я понял, что не вижу изменений в изображении игральных костей, так как цикл выполняется очень быстро. Затем, пройдя через Контроль скорости выполнения цикла, я поставил метод Thread.sleep, но до сих пор нет сдача.

Это мой код:

ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne);
for (int i=0;i<50;i++){
        int randomNum = random.nextInt(6);
        System.out.println("Random Value"+randomNum);
        dice.setImageResource(images[randomNum]);
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            System.out.println("ex called");
        }
    }

Может ли кто-нибудь объяснить причину этого? Я не получаю никаких ошибок в logcat.

это логкэт:

02-05 18:38:38.515: D/OpenGLRenderer(27058): Flushing caches (mode 0)
02-05 18:38:42.179: D/TextLayoutCache(27455): Using debug level: 0 - Debug Enabled: 0
02-05 18:38:42.239: D/libEGL(27455): loaded /system/lib/egl/libGLES_android.so
02-05 18:38:42.239: D/libEGL(27455): loaded /system/lib/egl/libEGL_mali.so
02-05 18:38:42.249: D/libEGL(27455): loaded /system/lib/egl/libGLESv1_CM_mali.so
02-05 18:38:42.249: D/libEGL(27455): loaded /system/lib/egl/libGLESv2_mali.so
02-05 18:38:42.279: D/OpenGLRenderer(27455): Enabling debug mode 0
02-05 18:38:50.146: D/OpenGLRenderer(27455): Flushing caches (mode 0)
02-05 18:38:52.148: I/System.out(27455): Random Value0
02-05 18:38:52.348: I/System.out(27455): Random Value4
02-05 18:38:52.579: I/System.out(27455): Random Value2
02-05 18:38:52.789: I/System.out(27455): Random Value1
02-05 18:38:53.029: I/System.out(27455): Random Value2
02-05 18:38:53.219: I/System.out(27455): Random Value4
02-05 18:38:53.420: I/System.out(27455): Random Value1
02-05 18:38:53.620: I/System.out(27455): Random Value1
02-05 18:38:53.830: I/System.out(27455): Random Value5
02-05 18:38:53.870: D/dalvikvm(27455): GC_CONCURRENT freed 1035K, 11% free 9856K/10979K, paused 12ms+2ms
02-05 18:38:54.070: I/System.out(27455): Random Value1
02-05 18:38:54.300: I/System.out(27455): Random Value5
02-05 18:38:54.501: I/System.out(27455): Random Value1
02-05 18:38:54.701: I/System.out(27455): Random Value4
02-05 18:38:54.931: I/System.out(27455): Random Value1
02-05 18:38:55.131: I/System.out(27455): Random Value1 
02-05 18:38:55.331: I/System.out(27455): Random Value1
02-05 18:38:55.532: I/System.out(27455): Random Value1
02-05 18:38:55.732: I/System.out(27455): Random Value1
02-05 18:38:55.942: I/System.out(27455): Random Value3
02-05 18:38:56.162: I/System.out(27455): Random Value1
02-05 18:38:56.362: I/System.out(27455): Random Value4
02-05 18:38:56.563: I/System.out(27455): Random Value5
02-05 18:38:56.763: I/System.out(27455): Random Value0
02-05 18:38:56.973: I/System.out(27455): Random Value2
02-05 18:38:57.193: I/System.out(27455): Random Value4
02-05 18:38:57.393: I/System.out(27455): Random Value3
02-05 18:38:57.594: I/System.out(27455): Random Value4
02-05 18:38:57.794: I/System.out(27455): Random Value4
02-05 18:38:58.004: I/System.out(27455): Random Value0
02-05 18:38:58.204: I/System.out(27455): Random Value0 
02-05 18:38:58.404: I/System.out(27455): Random Value5
02-05 18:38:58.605: I/System.out(27455): Random Value0
02-05 18:38:58.805: I/System.out(27455): Random Value5
02-05 18:38:59.005: I/System.out(27455): Random Value0
02-05 18:38:59.215: I/System.out(27455): Random Value2
02-05 18:38:59.415: I/System.out(27455): Random Value5
02-05 18:38:59.616: I/System.out(27455): Random Value2
02-05 18:38:59.816: I/System.out(27455): Random Value5
02-05 18:39:00.016: I/System.out(27455): Random Value4
02-05 18:39:00.216: I/System.out(27455): Random Value3
02-05 18:39:00.416: I/System.out(27455): Random Value4
02-05 18:39:00.617: I/System.out(27455): Random Value4
02-05 18:39:00.817: I/System.out(27455): Random Value1
02-05 18:39:01.027: I/System.out(27455): Random Value5
02-05 18:39:01.227: I/System.out(27455): Random Value3
02-05 18:39:01.427: I/System.out(27455): Random Value3
02-05 18:39:01.628: I/System.out(27455): Random Value5
02-05 18:39:01.828: I/System.out(27455): Random Value2 
02-05 18:39:02.028: I/System.out(27455): Random Value0
02-05 18:39:02.228: I/System.out(27455): Random Value2

person S.Basnagoda    schedule 05.02.2013    source источник
comment
Как насчет рисования растровых изображений на холсте SurfaceView вместо этого?   -  person Yaroslav Mytkalyk    schedule 05.02.2013
comment
Не самый эффективный метод, из документов: This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup.   -  person S.D.    schedule 05.02.2013
comment
Скорее всего, вы связываете поток GUI, не позволяя ему делать что-либо еще, например отображать ваши изображения.   -  person Peter Lawrey    schedule 05.02.2013


Ответы (2)


вместо спящего основного потока пользовательского интерфейса с помощью Thread.sleep создайте поток или используйте обработчик для ожидания изменения изображений в ImageView как:

new Handler().postDelayed(new Runnable() {
       public void run() {

            // put your code here to change image in ImageView...

       }
     }, 200);
person ρяσѕρєя K    schedule 05.02.2013
comment
Привет, спасибо за ваш ответ. Я не знаю, правильно ли я это делаю. Я снова написал код следующим образом. for (int i = 0; i < 50; i++) { new Handler().postDelayed(new Runnable() { public void run() { ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne); int randomNum = random.nextInt(6); System.out.println("Random Value" + randomNum); dice.setImageResource(images[randomNum]); } }, 1000);, но цикл выполняется очень быстро. Задержки не видно. Он печатает все 50 значений в течение секунды. Я делаю это правильно? - person S.Basnagoda; 06.02.2013
comment
@S.Basnagoda: не нужно использовать цикл for, просто удалите его - person ρяσѕρєя K; 06.02.2013
comment
удалить для цикла? Я хочу увидеть какое-то визуальное представление. Я имею в виду, что я хочу увидеть, как быстро меняются изображения в кости. Если я удалю цикл for, он изменит imageView только один раз. не так ли? спасибо ρяσѕρєя К. - person S.Basnagoda; 06.02.2013
comment
@S.Basnagoda S.Basnagoda: но ваша текущая логика не очень хороша, вы можете это сделать как public static int i=0; new Handler().postDelayed(new Runnable() { public void run() { ImageView dice = (ImageView) findViewById(R.id.imageViewrollingdiceOne); int randomNum = random.nextInt(6); System.out.println("Random Value" + randomNum); if(i<images.size()){ dice.setImageResource(i); i++; } else{ i=0; } } }, 1000); - person ρяσѕρєя K; 06.02.2013
comment
@ ρяσѕρєя K : В моем приложении не было проблем со сбоями. Я не понимаю, что вы говорите. - person S.Basnagoda; 06.02.2013

Я решил проблему. ответ выше также был очень полезен.

используется после внутри метода запуска.

handler.postDelayed(this, 200);

и это сработало. это полный ответ. обратитесь к этот< /а>.

final Handler handler = new Handler();
Handler.postDelayed(new Runnable(){
public void run(){
    int randomNum = random.nextInt(6);
    dice.setImageResource(images[randomNum]);
    handler.postDelayed(this, 200);
    }
 }, 200);

Спасибо.

person S.Basnagoda    schedule 06.02.2013