Это простое решение отлично работает для меня, единственное устройство, которое отменяет любые показанные в данный момент тосты:
public enum SingleToast {
INSTANCE;
private Toast currentToast;
private String currentMessage;
public void show(Context context, String message, int duration) {
if (message.equals(currentMessage)) {
currentToast.cancel();
}
currentToast = Toast.makeText(context, message, duration);
currentToast.show();
currentMessage = message;
}
}
Если вы хотите отменить ЛЮБОЙ тост (даже если сообщения отличаются), вы можете оставитьиз общей части currentMessage и включите currentToast! = null в качестве проверки отмены.
Недостаток первого метода заключается в том, что при запуске 2 разных тостов (#1 и # 2), вы больше не сможете отменить их при запуске # 1: это происходит потому, что синглтон сохранил # 2 как «текущий», даже если он еще не показан.Поэтому, когда вы снова запустите # 1, он все равно будет добавлен в очередь из 2 тостов: # 1, # 2, # 1, и все будет показано.
Так что выберите любое из этих двух решений, которое подходит вашему сценарию использования,или добавьте этот простой синглтон с помощью таймеров, угадайте, что именно так предложил Мохо.
Вызов тоста прост: я использую его, чтобы показать сообщение с некоторыми пользовательскими исключениями:
public abstract class CustomToastException extends Exception {
public CustomToastException(String message) {
super(message);
SingleToast.INSTANCE.show(context, getMessage(), Toast.LENGTH_LONG);
}
}
Обратите внимание, вЕсли кому-то было интересно: я поднял новый вопрос, не вызывает ли мое решение каких-либо проблем: Статический контекст, сохраненный в классе Application и используемый в сборщике тостов singleton, создает ли это утечку памяти?