簡體   English   中英

如何以編程方式導致Android延遲?

[英]How can I programmatically cause a delay in Android?

我嘗試使用Thread.sleep()但是沒有用。 當我使用它時,該應用程序停止響應。

我需要在代碼中添加一些延遲,例如:

public void inicioJogo(){
        for (int jogada = 1; jogada <= 50; jogada++) {
            for (int contador = 0; contador < jogada; contador++){
                // HERE - Wait 1 sec before go to next line.
                btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                // HERE - Wait 1 sec before go to next line.
                btPedra[sequencia[contador]].setBackgroundResource(imagensNormal[sequencia[contador]]);
                // Now continue looping.
            }
        }
}

我嘗試使用Handler,如下所示:

private Handler handler = new Handler();
    for (int jogada = 1; jogada <= 50; jogada++) {
        for (int contador = 0; contador < jogada; contador++){
            handler.postDelayed(new Runnable () {
                @Override
                public void run() {
                    btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                }
            }, 1000);
        }
    }

但是,當我使用它時,循環將繼續,然后等待1秒。 我需要一個可以使循環停止1秒鍾的延遲,轉到下一行,然后繼續循環。

您可以使用ScheduledExecutorService類的

ScheduledExecutorService scheduledExecutorService =
    Executors.newScheduledThreadPool(NO_OF_THREADS);

ScheduledFuture scheduledFuture =
    scheduledExecutorService.schedule(task, NO_OF_SECONDS_TO_WAIT, TimeUnit.SECONDS);

現在,在延遲NO_OF_SECONDS_TO_WAIT之后執行“任務”

它沒有響應的原因是因為您在當前線程上調用了sleep。 您正在處理的當前線程是UI線程。 因此,基本上,您嘗試更改背景,然后使線程休眠,以防止實際更改線程,直到完成休眠為止。

您需要在另一個線程中運行循環並在那里休眠,這樣才不會影響主線程:

final Handler handler = new Handler();
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int jogada = 1; jogada <= 50; jogada++) {
            for (int contador = 0; contador < jogada; contador++){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]);
                    }
                });
            }
        }
    }
}).start();

請注意, 啟動新線程之前,通過您創建的處理程序來完成后台更改。 該處理程序是在當前線程(即UI線程)上創建的,發布到它的每個消息都將在該線程上運行。

因此,基本上,您循環並在另一個線程上等待,但在UI線程上進行了后台更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM