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

时间:2018-11-27 17:24:40

标签: android runnable

我有一个处理程序实例,我尝试发布两个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的说明,它将可运行对象排队到与它关联的线程的消息队列中。这意味着两个吐司都应按照入队的顺序进行显示。 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

在使Handler与主循环程序关联时,应记住它与主线程关联。因此,绝对不建议在主线程中调用Thread.sleep。 吐司也使用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);
        }
    });