敬酒排队怎么办?

时间:2018-11-07 21:55:14

标签: java android toast

我正在研究线程队列。我的目标是确保同一时间不超过一个烤面包重叠。示例以onCreate,onStart,onResume状态进行敬酒。

首先,我为带有烤面包队列和活动上下文的烤面包助手创建一个类。该队列执行一个线程,直到队列中没有任何项目,但是此代码不起作用。但是我不知道吐司该怎么办呢?如果我使用Thread.Sleep(4000),则主UI冻结

 public static void CreateToast(final ToastSettings toastSettings) {
        _toastQueue.add(toastSettings);
        if (_toastQueue.size() == 1) {
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    while (_toastQueue.size() != 0) {
                        Toast.makeText(_toastQueue.get(0).getContext(), _toastQueue.get(0).getMessage(), _toastQueue.get(0).isLong() ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT).show();
                        _toastQueue.remove(_toastQueue.get(0));
                        //thread sleep 4sec ??
                    }
                }
            });
        }
    }

2 个答案:

答案 0 :(得分:0)

您可以使用postDelayed

  

导致将Runnable r添加到消息队列中,以便运行   经过指定的时间后。

例如:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 1500ms
  }
}, 1500);

答案 1 :(得分:0)

  

处理程序使您可以发送和处理与线程的MessageQueue相关的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列关联。创建新的Handler时,它将绑定到正在创建它的线程的线程/消息队列中-从那时起,它将把消息和可运行对象传递到该消息队列,并在它们从消息中出来时执行它们队列。

请参阅this答案以了解其行为方式。

根据我的理解,如果您不希望它中断主线程,您将需要在单独的线程中创建Handler,因为该处理程序将可运行对象发布到创建该线程的线程上。

new Thread(()->{
    _toastQueue.add(toastSettings);
    if (_toastQueue.size() == 1) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                while (_toastQueue.size() != 0) {
                    Toast.makeText(_toastQueue.get(0).getContext(), _toastQueue.get(0).getMessage(), _toastQueue.get(0).isLong() ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT).show();
                    _toastQueue.remove(_toastQueue.get(0));
                    //thread sleep 4sec ??
                }
            }
        });
    }
}).start();

将您拥有的代码包装在一个单独的线程中并启动它,应使烤面包机独立于主程序运行。