2015-11-04 48 views
1

我怎么能从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(); 

我的代码有问题吗?

+2

两件事情。首先,'e.getLocalizedMessage()'不是处理异常的常用方法,因为它不提供解决问题所需的所有信息。使用e.printStackTrace()。其次,我们无法知道您的代码出了什么问题,因为没有任何问题。这里有很多我们不知道的事情。您的限制变量是否设置为至少1?运行实际运行吗?尝试插入'Log.d(“thread”,“somemessage 1”);'在你的代码中的几个点(1被1,2,3,4等替换)并回传给你的输出,当你这样做时,我们可能会提供帮助。 –

+1

@DaniëlvandenBerg非常感谢您对exeptions的评价。是的代码运行完美,限制设置为1以上,当我把日志后'尝试'我看到日志里面LogCat – behrooz

+0

如果你把它放在睡眠之后,你看他们出现与预期的3第二个时间间隔,还是代码跳过睡眠? –

回答

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

八月11日至4日:23:38.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:1的8月11日至四日:23:38.920 11419-11452/nl.buroboot .danielvandenberg.bootsnelleinvoer d/ThreadTest:2 8月11日至4日:23:41.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:3 8月11日至4日: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日至4日08:23:44.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:3 8月11日至4日:23:44.920 11419-11452/nl.buroboot .danielvandenberg.bootsnelleinvoer d/ThreadTest:4 8月11日至4日:23:44.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:1月11日至4日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日至四日08:23:47.920 11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:5

在我的情况下,代码确实等了三秒钟,所以没有什么问题。但有趣的是,“5”可以在下一个1之后出现。这是因为runOnUiThread的工作方式。它所做的是否将您提供的可运行内容放入队列中。从这个队列中,android会一次抓取一个runnable,并在Ui线程有时间运行时运行它。这意味着,如果你是做这样的事情:

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

,你会得到一个日志,如:

8月一十一日至4日:27:51.810 14909-14942/nl.buroboot .danielvandenberg.bootsnelleinvoer d/ThreadTest:一月11日至4日08:27:51.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:2 8月11日至4日:27:54.815 14909-14942/NL .buroboot.danielvandenberg。bootsnelleinvoer d/ThreadTest:3月11日至4日08:27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:4月11日至4日08:27:54.815 14909-14942/nl.buroboot。 danielvandenberg.bootsnelleinvoer d/ThreadTest:一月11日至4日08:27:54.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:2月11日至4日08:27:57.815 14909-14942/NL。 buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:3八月11日至4日:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:4月11日至4日08:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer D/ThreadT EST:1月11日至4日08:27:57.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:2 8月11日至4日:28:00.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:三月11日至4日08:28:00.815 14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer d/ThreadTest:4

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

我对解决这个建议:Breakpoints。试着弄清楚你的UI线程是否挂起,如果是的话,并解决这个问题。此代码的功能应该如此。

-1

因为反对票:请注意评论在下面的源代码,他们会告诉你如何一切正常。

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(); 
    } 
+1

你能否请[编辑]解释为什么这段代码回答这个问题?仅限代码答案[阻止](http://meta.stackexchange.com/q/148272/274165),因为他们没有教导解决方案。 (还有什么意见?) –

+0

请参阅代码中的注释。如果我写“不要(!)使用Thread.sleep(1);”代码之外?提问的人必须仔细检查他的代码是否将正确的行为应用到他的应用程序中。因此,在那时他应该能够认识到评论“我们等到条件匹配以适应我们的需求”的重要性。这暂停了行动......并非真正的火箭科学。 –

+0

“也许你正在实现这个目标”的框架,根本没有意义,可能是什么让我失望。 –