我已经提前将代码引入到我自己的项目中,并添加了一些调试代码。这是我使用的代码和我收到的输出。
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线程是否挂起,如果是的话,并解决这个问题。此代码的功能应该如此。
两件事情。首先,'e.getLocalizedMessage()'不是处理异常的常用方法,因为它不提供解决问题所需的所有信息。使用e.printStackTrace()。其次,我们无法知道您的代码出了什么问题,因为没有任何问题。这里有很多我们不知道的事情。您的限制变量是否设置为至少1?运行实际运行吗?尝试插入'Log.d(“thread”,“somemessage 1”);'在你的代码中的几个点(1被1,2,3,4等替换)并回传给你的输出,当你这样做时,我们可能会提供帮助。 –
@DaniëlvandenBerg非常感谢您对exeptions的评价。是的代码运行完美,限制设置为1以上,当我把日志后'尝试'我看到日志里面LogCat – behrooz
如果你把它放在睡眠之后,你看他们出现与预期的3第二个时间间隔,还是代码跳过睡眠? –