我正在研究线程队列。我的目标是确保同一时间不超过一个烤面包重叠。示例以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 ??
}
}
});
}
}
答案 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();
将您拥有的代码包装在一个单独的线程中并启动它,应使烤面包机独立于主程序运行。