无法在for循环中暂停/休眠线程

beh*_*ooz 1 multithreading android sleep

我如何从for循环内部睡眠线程.

这就是我正在尝试但没有睡眠.

Thread newTread = new Thread() {

    @Override
    public void run() {

        for (int x = 0; x < limit; x++) {

            //some_code

            try {
                 Thread.sleep(3000);
            }
            catch (Exception e){
                 e.getLocalizedMessage();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //someCode       
                    }
                });
            }
        }
    };
    newTread.start();
Run Code Online (Sandbox Code Playgroud)

我的代码有问题吗?

Dan*_*erg 5

我已经将代码抛入我自己的项目中,并添加了一些调试代码.这是我使用的代码和我收到的输出.

    Thread newTread = new Thread() {

        @Override
        public void run() {

            for (int x = 0; x < 3; x++) {

                Log.d("ThreadTest","1");

                try {
                    Log.d("ThreadTest","2");
                    Thread.sleep(3000);
                    Log.d("ThreadTest", "3");
                }
                catch (Exception e){
                    e.printStackTrace();
                }

                Log.d("ThreadTest","4");
                runOnUiThread(new Runnable() {
                                  @Override
                                  public void run() {
                                      Log.d("ThreadTest","5");
                                  }
                              });
            }
        }
    };
    newTread.start();
Run Code Online (Sandbox Code Playgroud)

11-04 08:23:38.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:23:38.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:2 11- 04 08:23:41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:3 11-04 08:23:41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4 11-04 08 :23:41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:23:41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:2 11-04 08:23 :41.920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:5 11-04 08:23:44.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:3 11-04 08:23:44.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4 11-04 08:23:44.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:23:44.920 11419- 11452/nl.buroboot.danielvandenberg.bootsnelle 发件人D/ThreadTest:2 11-04 08:23:44.920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:5 11-04 08:23:47.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:3 11-04 08:23:47.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4 11-04 08:23:47.920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest :5

在我的情况下,代码实际上等了三秒钟,所以没有任何错误.然而,有趣的是,"5"可以出现在下一个1 之后.这是因为runOnUiThread的工作方式.它的作用是将你提供的runnable放在队列中.从这个队列中,android将一次抓取一个runnable并在Ui线程有时间运行它时运行它.这意味着,如果您要做这样的事情:

    newTread.start();
    boolean a = true;
    while (a){
        try {
            Thread.sleep(1);
            a = a;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

你会得到一个像日志:

11-04 08:27:51.810 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:27:51.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:2 11- 04 08:27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:3 11-04 08:27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4 11-04 08 :27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:2 11-04 08:27 :57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:3 11-04 08:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4 11-04 08:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:1 11-04 08:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:2 11-04 08:28:00.815 14909- 14942/nl.buroboot.danielvandenberg.bootsnelle 发件人D/ThreadTest:3 11-04 08:28:00.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest:4

请注意,那里没有一个5.这是因为UI线程太忙而无法执行堆栈.我猜这正是发生在你身上的事.

我建议修复此问题:断点.试着弄清楚你的UI线程是否挂起,如果是这样的话,并解决它.此代码可以正常运行.