Android:一个活动中有多个处理程序



我有一个处理程序实例,我尝试发布两个Runnables。但我观察到的是,只有最新的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的解释,它将可运行程序排入与其关联的线程的消息队列。这意味着两个吐司都应该按照排队的顺序显示。有人能解释一下吗?

当您使处理程序与主活套相关联时,您应该记住它与主线程相关联。因此,在主线程中调用Thread.sleep是绝对不鼓励的,应该避免。Toast也使用UI线程,但您可以通过冻结此线程来防止它出现。代码中发生的步骤如下:

  1. 显示第一个Toast的操作已排队
  2. 显示第二个Toast的操作已进入队列

    //第一动作执行

  3. 使线程休眠3秒
  4. 显示第一个吐司已排队

    //第一个Toast应该出现在这里,但它并没有在您调用该方法的那一刻发生。将其视为主活套中排队的另一条消息

  5. 使线程休眠3秒
  6. 显示已排队的第二个吐司
  7. 显示第一个吐司
  8. 显示第二个吐司

最后会显示两个烤面包,但你只能看到最后一个,因为它显示在第一个烤面包之后并覆盖它。如果你想显示两个短延迟的烤面包,请使用后延迟方法,或类似的方法:

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

最新更新