无法在 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();
}
如何从 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();
}