Проблемы с совпадением тостов на Oreo (8.1)

У меня проблема с тостами. Для API 26 и ниже тосты отображаются правильно (следующий тост ждет, пока предыдущий не исчезнет), но на Android 8.1 (API 27) они покрывают друг друга. У меня есть канал уведомлений, подобный этому:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
 NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, 
 NOTIFICATION_CHANNEL_NAME, 
 NotificationManager.IMPORTANCE_DEFAULT);
 notificationManager.createNotificationChannel(notificationChannel);
 builder.setChannelId(NOTIFICATION_CHANNEL_ID);
}

Это фиксирует тосты на 8.0 для меня, но на 8.1 они все еще перекрываются

Есть ли способ исправить это, вместо того, чтобы помнить последний использованный тост и отменить его вручную?

Редактировать:

Обходной путь из этой темы не работает

/**
 * <span>public void showAToast (String st)</span>
 * this little method displays a toast on the screen.
 * it checks if a toast is currently visible
 * if so 
 * ... it "sets" the new text
 * else
 * ... it "makes" the new text
 * and "shows" either or 
 * @param st the string to be toasted
 */

public void showAToast (String st){ //"Toast toast" is declared in the class
 try{ toast.getView().isShown(); // true if visible
 toast.setText(st);
 } catch (Exception e) { // invisible if exception
 toast = Toast.makeText(theContext, st, toastDuration);
 }
 toast.show(); //finally display it
}

тосты, все еще перегруженные

Изменить 2: я создал историю для этой ошибки на Android Issue Tracker: link

1 ответ

private static final int TIME_DELAY = 4000;
private static long lastToastShowTime = 0;

showToast(final String msg, final Context ctx){
 final long pastTime = System.currentTimeMillis() - lastToastShowTime;
 if(pastTime > TIME_DELAY ){

 Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
 lastToastShowTime = System.currentTimeMillis();

 }else{
 final long delay = TIME_DELAY - pastTime;
 lastToastShowTime = System.currentTimeMillis() + delay;
 postDelayed(new Runnable(

 @Override
 public void run() {
 try{
 Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
 catch(Exception e){
 Log.e("TOAST_NOT_SHOWED", "Toast not showed: " + msg, e);
 }

 }

 ), delay);

 }
}

licensed under cc by-sa 3.0 with attribution.