Android: несколько обработчиков в одном действии - PullRequest
0 голосов
/ 27 ноября 2018

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

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, он помещает runnables в очередь сообщений потока, с которым он связан.Это означает, что оба тоста должны отображаться в том порядке, в котором они поставлены в очередь.Может кто-нибудь объяснить это?

1 Ответ

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

Когда вы создаете обработчик, связанный с основным петлителем, вы должны помнить, что он связан с основным потоком.Поэтому вызывать Thread.sleep в основном потоке абсолютно не рекомендуется, и его следует избегать.Тосты также используют поток пользовательского интерфейса, но вы предотвращаете его появление, замораживая этот поток.Шаги, выполняемые в вашем коде, следующие:

  1. Действие, чтобы показать первый тост, ставится в очередь
  2. Действие, чтобы показать второй тост, ставится в очередь

    // Выполнение первого действия

  3. Задержка потока на 3 секунды
  4. Показ первого тоста в очереди

    // Здесь должен появиться первый тост, ноэто не происходит в тот момент, когда вы вызвали метод.Рассматривайте его как очередное сообщение, поставленное в очередь в главном цикле

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