Как сделать тост очереди? - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над очередью потоков. Моя цель - не перекрывать более одного тоста одновременно. Пример Тосты вызова в состояниях onCreate, onStart, onResume.

Сначала я создаю класс для помощника тоста, который имеет очередь тоста с контекстом активности. Эта очередь выполняет поток, пока в очереди нет элементов, но этот код не работает. Но я не знаю, тост, как сделать, чтобы ждать тост? если я использую Thread.Sleep (4000), то основной пользовательский интерфейс зависает

 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 голосов
/ 08 ноября 2018

Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Каждый экземпляр обработчика связан с одним потоком и очередью сообщений этого потока. Когда вы создаете новый обработчик, он привязывается к потоку / очереди сообщений потока, который его создает - с этого момента он будет доставлять сообщения и исполняемые файлы в эту очередь сообщений и выполнять их по мере их выхода из сообщения. очереди.

См. этот ответ о причинах такого поведения.

Насколько я понимаю, если вы не хотите, чтобы он прерывал основной поток, вам нужно будет создать обработчик в отдельном потоке, так как обработчик публикует исполняемый файл в потоке, в котором он был создан.

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

Оборачивание кода, который вы имеете в отдельном потоке, и запуск его должен позволить тосту работать независимо от основного.

0 голосов
/ 08 ноября 2018

Вы можете использовать postDelayed .

Заставляет Runnable r быть добавленным в очередь сообщений для запуска по истечении указанного количества времени.

например:

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