Java 使用Thread.sleep理解循环中的吐司
我是Android开发的新手。只是想测试下面的代码,单击按钮可以执行一些任务。由于Toast是异步的,日志显示循环结束后,Toast会弹出。但是Java 使用Thread.sleep理解循环中的吐司,java,android,toast,Java,Android,Toast,我是Android开发的新手。只是想测试下面的代码,单击按钮可以执行一些任务。由于Toast是异步的,日志显示循环结束后,Toast会弹出。但是 当我注释掉Thread.sleep()(在没有Thread.sleep()的情况下循环)时,所有的祝酒词都显示在0到14之间 当Thread.sleep(1000)时,则祝酒时间从7点到14点 当Thread.sleep(500)时,祝酒词的显示范围从3到14 当Thread.sleep(2000)时,只显示第14个吐司 为什么会这样?据我所知,这
- 当我注释掉Thread.sleep()(在没有Thread.sleep()的情况下循环)时,所有的祝酒词都显示在0到14之间
- 当Thread.sleep(1000)时,则祝酒时间从7点到14点
- 当Thread.sleep(500)时,祝酒词的显示范围从3到14
- 当Thread.sleep(2000)时,只显示第14个吐司
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int i=0;
int j=0;
Log.d("tag", "sec "+i);
while(i++<15){
Log.d("tag", "sec "+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),"num"+(j),Toast.LENGTH_SHORT).show();
j++;
}
}
});
button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
int i=0;
int j=0;
日志d(“标签”、“第二节”+i);
而++
Toast是异步的
首先,Toast在默认情况下不是异步的
为什么会这样
使用toast.LENGTH\u SHORT
创建的toast的生存期为2秒。现在,如果您的UI线程被锁定(因为线程.sleep
),那么toast将不会出现在屏幕上。它将在显示之前“死亡”
如何使其按预期工作
在新创建的线程中运行整个块
,只在主线程中创建并显示Toast
,
你需要按照以下思路做一些事情
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
int j = 0;
Log.d("tag", "sec " + i);
while (i++ < 15) {
Log.d("tag", "sec " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
final int finalJ = j;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "num" + (finalJ), Toast.LENGTH_SHORT).show();
}
});
j++;
}
}
}).start();
}
});
注意-不要在主线程中使用Thread.sleep
,它会阻塞用户界面并导致用户体验不佳
Toast是异步的
首先,Toast在默认情况下不是异步的
为什么会这样
使用toast.LENGTH\u SHORT
创建的toast的生存期为2秒。现在,如果您的UI线程被锁定(因为线程.sleep
),那么toast将不会出现在屏幕上。它将在显示之前“死亡”
如何使其按预期工作
在新创建的线程中运行整个块
,只在主线程中创建并显示Toast
,
你需要按照以下思路做一些事情
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
int j = 0;
Log.d("tag", "sec " + i);
while (i++ < 15) {
Log.d("tag", "sec " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
final int finalJ = j;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "num" + (finalJ), Toast.LENGTH_SHORT).show();
}
});
j++;
}
}
}).start();
}
});
p.S-永远不要在主线程中使用线程。睡眠,它会阻塞用户界面并导致用户体验不佳。默认情况下,Toast不是异步的。你能清除它吗?它何时异步运行?何时同步?异步基本上意味着操作是在不同的线程上完成的(即不在用户界面线程中)。现在,除非您明确地这样做,Toast
s从来都不是异步的。异步并不意味着“在另一个线程上”使用Android术语,它意味着一段代码作为事件在带有循环器的线程上调度,这通常是使用处理程序来完成的。Android上的Toast实际上是在主线程上异步调度的。换句话说,它们作为事件排队,由主线程异步处理。如果主线程被thread.sleep()
阻塞,那么它将无法运行任何先前排队的show toast事件,直到它被取消阻塞。toast的默认情况下不是异步的。您可以清除它吗?它何时异步和何时同步运行?异步基本上意味着操作是在不同的线程上完成的(即不在UI线程中)。现在,除非您明确这样做,Toast
s从来都不是异步的。异步并不意味着“在另一个线程上”使用Android术语,它意味着一段代码作为事件在带有循环器的线程上调度,这通常是使用处理程序来完成的。Android上的Toast实际上是在主线程上异步调度的。换句话说,它们作为事件排队,由主线程异步处理。如果e主线程被thread.sleep()
阻塞,那么它将无法运行任何先前排队的show toast事件,直到它被解除阻塞。