我有一个处理程序实例,我尝试发布两个Runnable。但是我观察到的是,最新的Toast仅在设备上打印。
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),"Showing from main activity",
Toast.LENGTH_SHORT).show();
}
});
handler.post(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),"Showing from main activity new",
Toast.LENGTH_SHORT).show();
}
});
按照Handler的说明,它将可运行对象排队到与它关联的线程的消息队列中。这意味着两个吐司都应按照入队的顺序进行显示。 有人可以解释一下吗?
答案 0 :(得分:1)
在使Handler与主循环程序关联时,应记住它与主线程关联。因此,绝对不建议在主线程中调用Thread.sleep。 吐司也使用UI线程,但是您可以通过冻结该线程来防止它出现。您的代码中发生的步骤如下:
显示第二个Toast的动作已入队
//执行第一个动作
显示第一个吐司已入队
//这里首先应该显示Toast,但是在您调用该方法时并没有发生。将其视为主循环程序中排队的另一条消息
最后显示了两个烤面包,但您只能看到最后一个烤面包,因为它显示在第一个烤面包的后面并覆盖了它。如果要短时间显示两个烤面包,请使用延迟后的方法或类似的方法:
final Handler handler = new Handler(Looper.getMainLooper());
final Context context = getApplicationContext();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Showing from main activity",
Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Showing from main activity new",
Toast.LENGTH_SHORT).show();
}
}, 3000);
}
});