【问题标题】:How can I programmatically cause a delay in Android?如何以编程方式导致 Android 延迟?
【发布时间】:2015-06-11 05:16:02
【问题描述】:

我尝试使用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 秒的延迟,然后转到下一行,然后继续循环。

【问题讨论】:

标签: java android timertask android-handler java-threads


【解决方案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 后执行

【讨论】:

    【解决方案2】:

    它没有响应的原因是因为你在当前线程上调用了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 线程上更改背景。

    【讨论】:

    • 哦,tyvm 家伙!有用!从昨天开始一直在寻找解决办法,非常感谢!
    • @MichaelMarcel 我的荣幸 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多