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

Can't pause / sleep thread inside for loop

如何从 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();

我的代码有问题吗?

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

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

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.bootsnelleinvoer 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。这是因为 运行OnUi 的方式线程有效。它的作用是将您提供的 运行nable 放入队列中。从这个队列中,android 将一次获取一个 运行nable 并在 Ui 线程有时间 运行 时 运行 它。这意味着,如果您要执行以下操作:

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

您会得到如下日志:

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.bootsnelleinvoer D/ThreadTest: 3 11-04 08:28:00.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadTest: 4

请注意,其中没有一个 5。这是因为 UI-thread 太忙而无法执行堆栈。我猜这正是发生在你身上的事情。

我的修复建议:Breakpoints。尝试找出您的 UI 线程是否挂起,如果挂起在哪里,然后解决这个问题。此代码正常运行。

由于否决票:请注意下面源代码中的注释,它们会告诉您一切如何工作。

private void waitForWifi() {
        mProgressDialog = new Dialog.Builder(MainActivity.this).show();

        // creating a thread to wait until the connection is established
        Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    while (!Utils.isConnected(MainActivity.this)) {
                     // we wait until condition is matching to fit our needs   
                     Thread.sleep(300); 
                     // Do NOT(!) use "sleep(1);" <- pure waste of battery    
                     // and won't in 99,9% of the situa. make your app better!
                    }
                    mProgressDialog.dismiss();
                    // perform a new action
        };
        t.start();
    }